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

时间:2012-04-18 06:22:26

标签: c++ multithreading openmp

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

test() {
   for(int i=0;i<100000000;i++);
}
main() {
    printf("Num of CPU: %d\n", 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。但它也没有效果。

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

5 个答案:

答案 0 :(得分:6)

你的问题在这里:

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

正确的条款是num_threads(4),而不是num_thread(4)。忽略不正确的openmp pragma,因此您最终得到了一个顺序程序。 :)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

在调用omp parallel section之前使用函数omp_set_num_threads(4)。

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

答案 3 :(得分:0)

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

我在64核的ubuntu服务器上测试过,它就像我的桌面一样! 我认为这是因为libopenblas与图书馆等图书馆发生冲突。

答案 4 :(得分:0)

首先选择项目_>属性-> c / c ++->语言->打开mp支持->选择是 然后您将找到上述一致性模式(将其设置为no)