openmp 相关问题

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

在 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

如何解释并修复使用 NVIDIA nvc 编译器执行 OpenACC 程序时出现的错误?

我将带有 OpenMP pragma 指令的并行 C 程序翻译为带有 OpenACC pragma 指令的 C 程序,通过删除原始 OpenMP pragma 并添加 OpenACC dire...

回答 1 投票 0

混合mpi/openmp与纯mpi的性能差异

我测试了一个简单的混合mpi/openmp编程: 无效 mpi_openmp_run () { 双 t00 = MPI_Wtime(); for(std::size_t tit=0; tit<1000; ++tit) { int tid ; doubl...

回答 1 投票 0

使用 Open MP 并行化前缀和

我有两个向量,a[n]和b[n],其中n是一个很大的数。 a[0] = b[0]; 对于 (i = 1; i < size; i++) { a[i] = a[i-1] + b[i]; } With this code we try to achieve that a[i] contains the sum ...

回答 1 投票 0

如何使用salloc在Slurm中运行混合MPI和openmp程序

如何使用salloc在Slurm中运行混合MPI和openmp程序,可以 使用以下命令指定 cpu 数量和 openmp 线程数量:salloc ?

回答 1 投票 0

如何为hyrid mpi和openmp编写cmake文件

如何在CMake文件中包含MPI和OpenMP编译器? 我尝试包含以下几行: #this 找出 mpi 的编译器 find_package(需要 MPI) #this 找出 openmp 的编译器

回答 1 投票 0

初始化变量并使用 -g 进行编译时,Fortran OMP 并行化出现奇怪的行为

在使用 OMP 并行化较大的代码时,我遇到了一个非常奇怪的行为。我花了几个小时才把它归结为这个非常简单的 MWE。当在 OMP DO 中调用子例程 testsub 时

回答 1 投票 0

前缀和并行算法

我正在研究并行求和扫描算法,但我的结果不正确。 我正在致力于在 OpenMP 中实现 Hillis Steele Scan。 我的函数输出不正确的结果 无效

回答 1 投票 0

直接的C代码需要很长时间才能运行,有什么方法可以优化它吗?

我编写了一个基本代码,利用蛙跳积分器(又名踢漂移踢)来模拟重力系统。到目前为止,它已经成功地模拟了您输入的任何势能的轨道。

回答 1 投票 0


WSL 上的 Intel MKL 出现符号查找错误

我有一个 C++ 项目并使用 CMake 构建它。我在 Windows 上没有问题。但是,当我在 WSL 上尝试时,出现符号查找错误: /opt/intel/oneapi/mkl/latest/lib/libmkl_intel_thread.so.2: unde...

回答 1 投票 0

openmp pthread 对 avr-gcc 的支持

我一直在与一个青少年合作,使用 openmp 和 gcc 进行编译的多线程项目,但是我正在加入一个使用 avr-gcc 的项目,它似乎不想编译或识别 omp.h...

回答 2 投票 0

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