C++ omp_get_max_线程数大于内核数时的Openmp性能

C++ omp_get_max_线程数大于内核数时的Openmp性能,c++,multithreading,performance,parallel-processing,openmp,C++,Multithreading,Performance,Parallel Processing,Openmp,我是并行编程新手。我用C++编写了一个自己的吉布斯取样器。程序的概述是这样的 for(int iter=0; iter <=itermax; iter++){ //loop1 #pragma omp parallel for schedule(dynamic) for(int jobs= 0; jobs<=1000; jobs++){ // loop2 small_job(); #pragma omp critical(dataupdate){

我是并行编程新手。我用C++编写了一个自己的吉布斯取样器。程序的概述是这样的

 for(int iter=0; iter <=itermax; iter++){ //loop1
 #pragma omp parallel for schedule(dynamic) 
 for(int jobs= 0;  jobs<=1000; jobs++){ // loop2
     small_job();
     #pragma omp critical(dataupdate){
        data_updates()
     }
 } 
   jobs_that_cannot_be_parallelized();
}

对于(int-iter=0;iter为什么不切换到OpenMP的
任务
s?数据更新有多大
,您能为每个小作业减少它或将数据存储到不同的位置,然后再合并它们吗?高系统负载很奇怪(这里有I/O吗?),而loop2基本上不应该创建太多线程。@osgx data_更新只是写入一个公共数组(数组的大小很大)相比之下,每个小作业都是大的。考虑到小作业从多个公共阵列读取,使用任务有什么好处。数据更新中没有I/o。你的意思是将小作业的数据存储在硬盘中吗?如果不是,我不确定如何将小作业中的不同数据存储在每个小作业的变量中,除了一个公共数组之外数组(需要critical)。如果您能给我举个例子,我将不胜感激。您的编译器和omp库(gcc+libgomp;icc+intel omp库或???)是什么?如果是gcc+libgomp,请尝试设置几个环境变量,并在omp线程计数等于cpu计数的情况下重新运行:
export GOMP_cpu_AFFINITY=“0-63”
导出OMP\u WAIT\u POLICY=ACTIVE
(对于I/O,我指的是系统负载高的唯一原因;对于小作业结果,我指的是
OMP critical
对性能不利,而
OMP atomic
OMP reduce
更好,最好的可能是将作业编号I的结果写入某个数组
数组[I]
;对于任务,我的意思是,omp任务对于可变作业可能比对于任务更好)osgx试图说的是,
omp关键的
+更新通常可以增强为
omp reduce
。例如,如果你有一个并行的for,其中你有一个短作业,然后是一个做总和的关键任务(或任何其他更新操作),您可以将它们合并到并行中进行缩减(如果需要,您可以编写自定义缩减)。