gpt4 book ai didi

c - OpenMP 大大减慢了 for 循环

转载 作者:行者123 更新时间:2023-12-05 01:48:07 25 4
gpt4 key购买 nike

我正在尝试使用 OpenMP 并行化来加速这个 for 循环。我的印象是这应该将工作分散到多个线程中。但是,也许开销太大,无法给我任何加速。

我应该提到这个循环发生了很多很多次,并且循环的每个实例都应该并行化。循环迭代次数 newNx 可以小至 3 或大至 256。但是,如果我有条件地将它并行化为 newNx > 100(仅最大循环),它仍然会显着减慢。

这里有什么东西会导致它比预期的慢吗?我还应该提到 vector A、v、b 非常大,但我相信访问是 O(1)。

    #pragma omp parallel for private(j,k),shared(A,v,b)
for(i=1;i<=newNx;i+=2) {
for(j=1;j<=newNy;j++) {
for(k=1;k<=newNz;k+=1) {

nynz=newNy*newNz;

v[(i-1)*nynz+(j-1)*newNz+k] =
-(v[(i-1)*nynz+(j-1)*newNz+k+1 - 2*(k/newNz)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kup+offA] +
v[(i-1)*nynz+(j-1)*newNz+ k-1+2*(1/k)]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + kdo+offA] +
v[(i-1)*nynz+(j - 2*(j/newNy))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jup+offA] +
v[(i-1)*nynz+(j-2 + 2*(1/j))*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + jdo+offA] +
v[(i - 2*(i/newNx))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + iup+offA] +
v[(i-2 + 2*(1/i))*nynz+(j-1)*newNz+k]*A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ido+offA] -
b[(i-1)*nynz + (j-1)*newNz + k])
/A[((i-1)*nynz + (j-1)*newNz + (k-1))*spN + ifi+offA];}}}

最佳答案

假设您没有竞争条件,您可以尝试融合循环。融合将提供更大的 block 进行并行化,这将有助于减少错误共享的影响,并可能更好地分配负载。

像这样的三重循环

for(int i2=0; i2<x; i2++) {
for(int j2=0; j2<y; j2++) {
for(int k2=0; k2<z; k2++) {
//
}
}
}

你可以这样融合它

#pragma omp parallel for
for(int n=0; n<(x*y*z); n++) {
int i2 = n/(y*z);
int j2 = (n%(y*z))/z;
int k2 = (n%(y*z))%z;
//
}

在你的情况下你可以这样做

int i, j, k, n;
int x = newNx%2 ? newNx/2+1 : newNx/2;
int y = newNy;
int z = newNz;

#pragma omp parallel for private(i, j, k)
for(n=0; n<(x*y*z); n++) {
i = 2*(n/(y*z)) + 1;
j = (n%(y*z))/z + 1;
k = (n%(y*z))%z + 1;
// rest of code
}

如果这成功地加速了您的代码,那么您会感觉很好,因为您使您的代码更快,同时进一步混淆了它。

关于c - OpenMP 大大减慢了 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18749493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com