我有一个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分成较小的数组,它们会加快循环的执行速度吗?
答案 0 :(得分:0)
据我所知,不,您不能使用OpenMP运行时函数显式拆分数组。 OpenMP所做的是将相等的工作负载分配给每个线程。假设您已定义 OMP_NUM_THREADS = 10 ,那么每个线程将接收100000次迭代来执行。否则,如果余数不等于0,则最后一个线程的工作量将减少。(您可以为线程分配线程亲和力。)
不。但是您可以增加线程数以获得更好的性能(直到线程的开销超过加速的时候为止)