我正在尝试使用 OpenMP/CilkPlus 将 test_function main 内部的 for 循环中的函数调用并行化(如 C 代码所示)。对于每次迭代,读/写操作仅发生在 2d_array 的一行上,因此迭代中没有数据依赖性(2d_array 在可用线程之间共享,默认情况下 i 是私有的)。
void test_function(int *in, int len)
{
int i, value;
int *x, *low, *high;
x = x_alloc + 4;
for (i=0; i<len; i++)
x[i] = in[i];
for(i=1;i<=4;i++)
{
x[-i] = x[i];
x[(len-1) + i] = x[(len-1) - i];
}
high = malloc(sizeof(int)*((len>>1) + 1));
for(i=0; i < ((len>>1) + 1); i++)
{
value = x[-4 + 2*i] + x[2 + 2*i] + x[-2 + 2*i] + x[2*i];
high[i] = x[-1 + 2*i] - value;
}
low = malloc(sizeof(int)*(len>>1));
for(i = 0; i < (len>>1); i++)
{
value = high[i] + high[i + 1];
low[i] = x[2*i] - value;
}
for (i=0; i<(len>>1); i++)
in[i] = low[i];
in[i+(len>>1)] = high[i+1];
free(low);
free(high);
}
int main{...}
...
int **2d_array;
...
#pragma omp parallel for
for(i = 0; i < height; i++){
test_function(2d_array[i], width);
}
无论如何,结果是错误的。还尝试了 cilk_for 而不是 OpenMP 编译指示。在每次迭代期间更改每一行时,是否有特定的方法来处理 2D 数组?