我使用的是 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/