我写了一个简单的代码片段,其中每个线程的工作量都非常不同。有些线程需要计算数百次迭代,而其他线程只需进行一次迭代即可获得所需的结果:
for(int i=0; i<height; i++){
for(int j=0; j<width; j++){
complex<float> c((float)j/width-1.5,(float)i/height-0.5);
complex<float> z(0, 0);
int count =0;
while(abs (z) < 2 && count < MAX_IT){
z=z*z + c;
++count;
}
image[i][j]=count;
}
}
使用lscpu
,我检查有多少个内核,每个内核的线程和pros套接字可用的内核。现在,我想使用了解CPU拓扑的OpenMP来使此代码段并行化。
可以定义诸如以下的环境变量
OMP_PLACES='threads(12)
OMP_PLACES='cores(4)'
OMP_PLACES='sockets(2)'
还有处理器绑定的可能性,例如
#pragma omp parallel proc_bind(master|close|spread)
我无法理解如何正确使用它们(仅凭尝试和错误)。有人在这里有经验吗?
谢谢