为什么 OpenMP 程序只在一个线程中运行

Why OpenMP program runs only in one thread

本文关键字:一个 线程 运行 程序 OpenMP 为什么      更新时间:2023-10-16

我刚刚用一个简单的c程序尝试了OpenMP

test() {
   for(int i=0;i<100000000;i++);
}
main() {
    printf("Num of CPU: %dn", omp_get_num_procs());
    #pragma omp parallel for num_threads(4)
    for(int i=0;i<100;i++) test();
}

g++ -fopenmp编译。它可以正确打印出我有 4 个 CPU,但所有测试功能都在thread 0运行。

我试图修改OMP_NUM_THREADS.但它也没有效果。

我拥有与在线示例相同的所有内容,但为什么我不让它工作呢?

你的问题在这里:

#pragma omp parallel for num_thread(4) <---

正确的子句是num_threads(4),而不是num_thread(4)。不正确的 openmp 编译指示将被忽略,因此您最终得到了一个顺序程序。:)

我很惊讶你没有收到编译器警告,因为我收到了。

我在Visual Studio中

遇到了这个问题,最后我明白我忘记在Visual Studio中启用Open MP支持。它没有给我任何错误,但只为一个线程执行了程序

首先选择项目 _>属性 -> C/C++ -> 语言 -> 打开 MP 支持 -> 选择是然后你会发现上面的一致性模式(让它没有)

在调用 omp 并行部分之前使用函数 omp_set_num_threads(4)。

另外,您如何确定线程数?将您的 printfs 嵌入到关键部分,以确保所有内容都打印出来。

当我使用 C 代码扩展 numpy 模块时,我在 ubuntu 桌面上遇到了同样的情况。 OpenMP 只用一个线程运行。我碰巧删除了libopenblas-base并安装了libatlas-base-dev。(处理 numpy 安装问题)然后多线程 openmp 回来了:)

我已经在具有 64 个内核的 ubuntu 服务器上对其进行了测试,它就像我的桌面一样工作!我认为这是因为libopenblas与atlas等库冲突。

相关文章: