7

我刚刚用一个简单的 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. 但它也没有效果。

我的一切都与在线示例相同,但为什么我不能让它工作呢?

4

5 回答 5

7

你的问题在这里:

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

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

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

于 2012-04-18T19:27:00.190 回答
3

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

于 2014-08-02T14:10:49.210 回答
1

首先选择项目_>属性-> c/c++->语言->打开mp支持->选择yes然后你会发现上面的一致性模式(设为no)

于 2019-04-21T12:11:19.980 回答
0

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

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

于 2012-04-18T06:43:59.843 回答
0

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

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

于 2013-05-06T19:13:47.040 回答