OpenMP:不同的内存位置会加速循环吗?

时间:2019-03-17 19:33:36

标签: loops for-loop openmp

我有一个OpenMP程序,可以在循环中计算变量。

int a[1000000];
int b[1000000];
int c[1000000];
int d[1000000];

#pragma omp parallel for private(i) shared(a,b,c,d)
for (i=0;i<1000000;++i)
{
d[i] = b[i]*a[i] + c[i]+10;
}

我使用了perf,perf说瓶颈在于内存的读写。

第一个问题:是否可以使用OpenMP拆分数组A,B,C,D并将其放入不同的存储库中?

第二个问题:如果我将数组A,B,C,D分成较小的数组,它们会加快循环的执行速度吗?

1 个答案:

答案 0 :(得分:0)

  • 第一个问题:是否可以使用OpenMP拆分数组A,B,C,D并将其放入不同的存储库中?

据我所知,不,您不能使用OpenMP运行时函数显式拆分数组。 OpenMP所做的是将相等的工作负载分配给每个线程。假设您已定义 OMP_NUM_THREADS = 10 ,那么每个线程将接收100000次迭代来执行。否则,如果余数不等于0,则最后一个线程的工作量将减少。(您可以为线程分配线程亲和力。)

  • 第二个问题:如果我将数组A,B,C,D分成较小的数组,它们会加快循环的执行速度吗?

不。但是您可以增加线程数以获得更好的性能(直到线程的开销超过加速的时候为止)