openmp 相关问题

OpenMP是一种跨平台的多线程API,它允许使用特殊的编译器指令进行细粒度的任务并行化和同步。

OpenMP 并行块中出现意外输出

下面的程序,如果我的理解是正确的,应该创建最多10个线程并运行omp并行块: #包括 #包括 使用命名空间 std; int 我...

回答 1 投票 0

如何在 Mac OS 中为 mgcv R 软件包启用 openMP?

我正在尝试在 mgcv 中运行 GAMM,并希望利用多线程计算,但运行 Sonoma 14.1.1 的 Apple M2 Pro 上未启用 openMP。我对 R 的后端了解不多,所以

回答 1 投票 0

如何使用 OpenMP 生成单个线程(如 std::thread())并随后使用“#pragma omp single”和“#pragma omp for”?

我只想生成一个后台线程,例如 std::thread,但仅使用 OpenMP。 这可能吗? 如果是的话,是怎么做到的? 为了更好地解释我想要实现的目标,这里的 C++ 代码...

回答 1 投票 0

为什么我的 OpenMP 应用程序有时仅使用 1 个线程,有时使用 3 个线程,有时使用所有内核?

我注意到我的支持 OpenMP 的应用程序有时只使用 1 个线程。 如果我等待几分钟,它会使用更多线程(例如 3 个)。 如果我等待 15 分钟,它会使用所有线程。 为什么?

回答 1 投票 0

Fortran 中的 OpenMP 代码 - 归约问题

代码求解以下方程: A1(y,bp,kp) = \sum_i (B(y,yp_i)*C(Yp_i,Bp,Kp)*sum_j(D(bpp_j,kpp_j,yp_i,bp,kp)*A0(yp_i,bpp,kpp) ))) 我有以下包含多个 do 循环的代码。目的...

回答 1 投票 0

集群(ifort)上奇怪的 omp_get_wtime() 行为

我在本地 Windows 计算机和集群上运行相同的 Fortran 代码。 代码的重点是: 程序mwe 使用 omp_lib 隐式无 整数::索引 整数::indy 整数::...

回答 2 投票 0

OpenMP 并行比顺序慢得多

我正在根据一组给定的概率运行随机事件发生的模拟,直到命中 n 个事件,并根据需要重复多次迭代。当我运行这个序列时...

回答 1 投票 0

使用 OpenMP 跟踪线程中的进度

我正在尝试创建一个每秒显示来自不同线程的值的程序,作为进度跟踪功能的尝试,但不幸的是我无法正确并行化这个c...

回答 1 投票 0

缺少:OpenMP_C_FLAGS OpenMP_C_LIB_NAMES

我正在努力在 Mac OSX 上使用 OpenMP 编译项目。 错误是: /usr/local/Cellar/cmake/3.10.2/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:137 处的 CMake 错误(消息): C...

回答 6 投票 0

OpenMPI 和 OpenMP 核心绑定

我已阅读有关在 AMD 上运行 linpack 的文章 [1]。根据我的理解,执行策略是每个 L3 缓存有 1 个 MPI 等级,每个 L3 缓存有 4 个线程,因为 L3 缓存用于四个物理核心。不...

回答 1 投票 0

使用 OpenMP 并行化 3D 点云转换,无需额外的内存分配

我正在开发一个 C 程序,该程序使用变换矩阵 T 将线性变换应用于 3D 点云。每个点都是 n×3 矩阵中的一行,T 是一个 3×3 矩阵。我的目标是更新...

回答 1 投票 0

在 C++ 项目中使用 openmp 时没有观察到加速

我尝试将并行执行添加到我的 C++ 项目中。 因此,基于这个例子,我定义了我的 app.cpp 如下: #包括 #包括 #包括 int sum_s...

回答 1 投票 0

OpenMP for 循环比串行代码花费更多时间

我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25 倍的时间才能完成程序。有什么不对的吗?我该如何优化它? #包括 我尝试使用 OpenMP 并行化代码片段,结果发现使用 OpenMP 需要 25X 时间才能完成程序。有什么不对的吗?我该如何优化它? #include <iostream> #include <cmath> #include <random> #include <chrono> #include <cstdlib> #include <omp.h> using namespace std; int main() { unsigned long long black_square = 1, digit_square = 13; //auto n = ((black_square)<<11) * static_cast<unsigned long long>(pow(digit_square,10)); auto n = static_cast<unsigned long long>(1e9); srand(0); int tmp = 0; std::random_device rd; // Will be used to obtain a seed for the random number engine std::mt19937 gen(rd()); // Standard mersenne_twister_engine seeded with rd() std::uniform_int_distribution<> distrib(1, 6); auto tStart = std::chrono::high_resolution_clock::now(); //#pragma omp parallel for schedule(static) reduction(+:tmp) #pragma omp parallel for schedule(static) reduction(+:tmp) num_threads(8) for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==rand()%6))%static_cast<int>(1e9); //for (unsigned long long i=0; i<n; i++) tmp = (tmp+(5==distrib(gen)))%static_cast<int>(1e9); tmp%=static_cast<int>(1e9); auto tEnd = std::chrono::high_resolution_clock::now(); cout << tmp << " obtained after " << n << " iterations in " << (tEnd-tStart).count()/1e9 << "s." << endl; return 0; } 代码由g++ -o a.out -O3 -std=c++11 -fopenmp tmp.cpp编译,其中g++的版本为8.5.0 20210514。操作系统是RHEL8.9,有20个Intel Xeon CPUs at 2.593GHz。 串行代码平均运行时间为7.4s,而并行代码平均运行时间为180s。选项 -O3、-O2、-O1 具有相似的结果。随机生成器mt19937可以显着缩小性能差距,但并行代码仍然比串行版本慢得多。增加或减少 n 也会导致类似的结果。 rand()函数不需要是线程安全的。因此,像您所做的那样同时从多个线程调用它是不安全的 glibc 的 rand() 版本是线程安全的,但它是通过将整个函数包装在互斥体中来实现的。因此一次只有一个线程可以调用 rand()。由于在 rand 调用之外,您的代码执行的操作非常少,几乎所有执行时间都将在 rand() 内。 所以并行版本并不是真正的并行。每次调用 rand() 时,每个线程轮流一次执行一个。所以它比单线程没有优势。但实际上更糟糕的是,因为线程必须争夺谁获得互斥锁,在每次调用后唤醒和睡眠,并在每个 CPU 核心的缓存之间移动 PRNG 状态。所以比单线程差很多。 您应该做的是创建多个 PRNG 实例。有一个 gen 对象数组,每个线程一个。每个线程应该使用自己的 PRNG。确保每个对象在内存中相距足够远,不会共享缓存行,因此 PRNG 状态不需要在 CPU 缓存之间移动。

回答 1 投票 0

什么是 OpenMP?

OpenMP 的高级描述是什么? 维基百科文章指出“OpenMP(开放式多处理)是一个支持多平台共享内存的应用程序编程接口(API)

回答 2 投票 0

CMake 找不到 OpenMP

我正在尝试使用 OpenMP 进行编译。我的 CMakeLists.txt 包含行 find_package(需要 OpenMP) 和 CMake 错误 CMake 错误位于 /opt/ros/groovy/share/catkin/cmake/catkinConfig.cma...

回答 6 投票 0

openmp 的并行化变得更糟

我正在尝试将模糊无监督 c 均值算法与 openmp 并行化,我已经做到了,问题是当我使用 16/32 线程时,它应该比 8/4 线程提供更好的结果,但是

回答 1 投票 0

opencv::flann:Index knnsearch 线程安全吗?

我正在尝试将我的 ML 问题与 flann Index 并行化。简而言之,我的代码如下所示: 索引index(dict, KDTreeIndexParams(TREE_NUM)); // 巨大的字典,构建起来非常昂贵——更喜欢

回答 2 投票 0

使用 OMPT 跟踪基于任务的应用程序

我正在尝试使用 OMPT 来跟踪基于任务的应用程序。 这些是我用来编译 LLVM OpenMP 运行时的编译选项: cmake ../openmp -G "Unix Makefiles" -DCMAKE_C_COMPILER=...

回答 1 投票 0

使用 OpenMP 使用已知种子生成随机数的安全方法是什么?

我正在寻找一种方法,能够在输入种子已知的情况下与 OpenMP 并行安全地生成随机数。我搜索并最终找到了 OMPRNG。还有其他方法期待吗...

回答 3 投票 0

在 OpenMP 中并行运行 DO 循环和独立子例程调用

openmp 有没有一种有效的方法来执行以下操作: 当使用 openmp 并行执行 do 循环时,调用两个或多个可以独立运行且与循环并行的子例程。 任意

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.