gpt4 book ai didi

macos - macOS 上奇怪的并行部分 OpenMP 行为

转载 作者:行者123 更新时间:2023-12-02 04:23:09 26 4
gpt4 key购买 nike

我在使用默认编译器和 libomp 的 macO 上使用 OpenMP 时遇到了 OpenMP 功能问题。

更准确地说,当我跟踪以下代码的 CPU 使用率时,我希望有两个内核 100%(独立的部分和线程)。

在 Linux 上,它非常好,我的进程确实有 200% 的 CPU 使用率。

在 Mac 上,Instruments 追踪到一个非常奇怪的行为:一开始有一个峰值,CPU 使用率约为 1000%(我的计算机是双处理器 6 核 Intel Xeon E5 ~12 核)创建了很多线程,然后稳定在 200%(如预期)。

问题是,当我迭代并行部分时,峰值/热身完全破坏了我的表现。

有人对此有解释吗?

编辑:我已更新代码以澄清问题并添加执行行为的快照:Execution profile using macOs Instrumentes (预热在 ~1000%,平台在 200%,较小的在 100% --function2 比 function1 稍慢 --,并且重复两次)。

#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

auto N= 5000;
std::vector<int> vA(N),vB(N);
void function_1()
{
for (int k = 0; k != 3; k++)
{
std::cout << "Function 1 (k = " << k << ")" << std::endl;
for(auto i=0; i < N ; ++i)
for(auto j=0; j < N ; ++j)
vA[j] += i+cos(j); //Doing something meaningless
}
}

void function_2()
{
for (int k = 0; k != 4; k++)
{
std::cout << "Function 2 " << "(k = " << k << ")" << std::endl;
for(auto i=0; i < N ; ++i)
for(auto j=0; j < N ; ++j)
vB[j] += i+sin(j); //Doing something meaningless
}
}

int main()
{
for(auto y = 0; y < 2 ; ++y)
{
#pragma omp parallel sections
{
#pragma omp section
function_1();

#pragma omp section
function_2();
}
}
return 0;
}

最佳答案

我看到一些我认为需要在您的代码中修复的事情:

  1. rand() 永远不应并行使用:该函数使用全局内部状态,因此要么是非线程安全的,您将得到任何结果(包括可能的重复)你的数字跨线程),或者线程安全是通过互斥锁或等价物默默地强制执行的,并且访问将被序列化并且性能令人震惊。底线:找到一个线程安全的替代方案,其中状态作为参数显式传递给函数,例如 rand_r()
  2. 只需使用 OMP_NUM_THREADS 环境变量定义在运行时使用的线程数,而不是让操作系统决定生成与您机器中的内核一样多的线程数。例如,键入 OMP_NUM_THREADS=2 ./mycode 而不是 ./mycode(假设 mycode 是您的二进制文件的名称)
  3. 请注意,在您的两个函数中,您在最外层循环中重用了 ij,但在内部循环中隐藏了它们。在这里,这不是真正的问题,但这是非常糟糕的做法,我建议改正

关于macos - macOS 上奇怪的并行部分 OpenMP 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com