为什么 OpenMP 程序只在一个线程中运行
Why OpenMP program runs only in one thread
我刚刚用一个简单的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等库冲突。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 在另一个线程中调用luaL_error会引发qWarning
- C++一个线程如何正确通信其任务已完成?
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 如何制作一个只能在一个线程上同时执行的函数?
- 结束另一个线程中使用的对象的生存期
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 一个线程等待多个线程事件
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 计时器是否从另一个线程启动?
- 互斥,Windows 10,c ++,在一个线程上获取,在另一个线程上发布
- Qt 在另一个线程中无限循环
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 从另一个线程发出信号是否安全?
- AMQP-CPP,libev >停止ev_loop来自另一个线程