在我的代码中,我有很多片段都有一个双循环,并且需要更新结构中的值。问题在于它是一个结构数组,因此存在许多取消引用的情况。这是一个例子:
for(i=0;i<y;i++) {
for(j=0;j<x;j++) {
index = i*x+j;
y1 = (i + 1) % y;
x1 = (j + 1) % x;
y2 = (i == 0) ? (i + y - 1) : (i - 1);
x2 = (j == 0) ? (j + x - 1) : (j - 1);
str[i *x + j].arr[0] = c[index].arr[0];
str[i *x + x1].arr[1] = c[index].arr[1];
str[y1*x + j].arr[2] = c[index].arr[2];
str[i *x + x2].arr[3] = c[index].arr[3];
str[y2*x + j].arr[4] = c[index].arr[4];
str[y1*x + x1].arr[5] = c[index].arr[5];
str[y1*x + x2].arr[6] = c[index].arr[6];
}
}
我想尽可能地加快速度,也许使用OpenMP。我认为会有很多错误的共享,而且我也不能使用指针。你们知道一种有效的方法来加速这一过程(以及类似的代码)
最佳答案
你尝试过这样的事情吗?
#pragma omp parallel for
for(i=0;i<y;i++) {
y1 = (i + 1) % y;
y2 = i? i-1 : y-1;
for(j=0;j<x;j++) {
index = i*x+j;
x1 = (j + 1) % x;
x2 = j? j-1:x-1;
str[i *x + j].arr[0] = c[index].arr[0];
str[i *x + x1].arr[1] = c[index].arr[1];
str[y1*x + j].arr[2] = c[index].arr[2];
str[i *x + x2].arr[3] = c[index].arr[3];
str[y2*x + j].arr[4] = c[index].arr[4];
str[y1*x + x1].arr[5] = c[index].arr[5];
str[y1*x + x2].arr[6] = c[index].arr[6];
}
}
我认为不会有太多的错误共享,因为
str[]
仅从中读取,并且c[]
似乎在线程之间很好地分开了(不同线程写入的缓存行应该很少重叠)。只是尝试和计时。如果扩展性很好,那么错误共享就不是问题。