考虑CPU拓扑与OpenMP并行

时间:2019-01-13 12:32:03

标签: c++ openmp

我写了一个简单的代码片段,其中每个线程的工作量都非常不同。有些线程需要计算数百次迭代,而其他线程只需进行一次迭代即可获得所需的结果:

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)

我无法理解如何正确使用它们(仅凭尝试和错误)。有人在这里有经验吗?

谢谢

0 个答案:

没有答案