我有一个问题:我必须将这段代码与OMP并行化。
数据依赖存在问题,我不知道如何解决。
有什么建议么?
for (n = 2; n < N+1; n++) {
dz = *(dynamic_d + n-1)*z;
*(dynamic_A + n) = *(dynamic_A + n-1) + dz * (*(dynamic_A + n-2));
*(dynamic_B + n) = *(dynamic_B + n-1) + dz * (*(dynamic_B + n-2));
}
最佳答案
由于依赖性,您无法并行化循环迭代,但是可以使用以下部分拆分dynamic_A
vs dynamic_B
的计算:
#pragma omp parallel sections
{
#pragma omp section
{
// NOTE: Declare n and dz locally so that it is private!
for (int n = 2; n < N+1; n++) {
my_type dz = dynamic_d[n-1] * z;
dynamic_A[n] = dynamic_A[n-1] + dz * dynamic_A[n-2];
}
}
#pragma omp section
{
for (int n = 2; n < N+1; n++) {
my_type dz = dynamic_d[n-1] * z;
dynamic_B[n] = dynamic_B[n-1] + dz * dynamic_B[n-2];
}
}
}
请使用数组索引而不是引用异常的邪恶指针算法。
关于c - C-并行化递归运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42273169/