c++ - openmp随机只使用一个核心

标签 c++ openmp

我使用的是 Ubuntu 10.04,gcc 版本 4.4.3。我正在使用 omp.h 和 g++ 参数 -fopenmp 编译 C++ 代码。大多数时候一切都按预期工作。我有带超线程的四核,所以实际上是 8 个核。

随机地,当我运行我的软件(并观察系统监视器)时,所有 8 个内核的功率都达到 100%,风扇开始运转,一切都很好。在半秒内,除 1 个内核外,所有内核都关闭并进入非事件状态,一个仍在工作。

此时,如果我取消我的程序(只需简单的 Ctrl+C)并重新启动它 - 它会按预期工作,所有内核都会保持 100% 的工作状态。

以下是有用的代码片段:

28 #include <time.h>
29 #include <omp.h>
30 #include <string>
...
713 #ifdef _OPENMP
714         if(omp_get_dynamic())
715                 omp_set_dynamic(1);
716 #endif
717 
718 #pragma omp parallel
719         {
720 #pragma omp for schedule(dynamic) private(node)
721                 for (int c = 0; c < buffer->GetCount(); c++) {
... initialize objects pointers etc
724 #pragma omp critical(BUFFER_LOOKUP)
725                         {
... perform chunk of code that is a choke
734                         }

最佳答案

来自 omp_set_dynamic(n) 手册页: n ... 一个值,指示后续并行区域中可用的线程数是否可以由运行时调整。如果非零,运行时可以调整线程数,如果为零,运行时不会动态调整线程数

尝试使用 omp_set_dynamyc 的 #pragma omp parallel num_threads(n) 转动来设置您想要的线程数。

关于c++ - openmp随机只使用一个核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5264950/

相关文章:

c++ - 两个不同的 CPP 文件中的相同功能。我该如何做到这一点?

c++ - 单例类和线程安全

c++ - OpenMP 嵌套并行化

c++ - openmp parallel for collapse 私有(private)变量外循环

c++ - packaged_task 卡在 operator() 上

c++ - STL std::map 和 std::vector ;检查 map 中的对象类型

c++ - strcat访问冲突写位置c++

c++ - 为并行化的 for() 循环提供线程私有(private)预分配缓冲区?

clang - 主流编译器是否支持 OMPT?

macos - HighSierra LLVM中可以使用OpenMP吗?