【发布时间】:2016-01-03 05:17:40
【问题描述】:
我有一个具有数据依赖性的代码。
代码示例:
int data[1000*3];
int result[1000]={0,};
// initialize data[]
for(i=0; i<1000; i++)
{
a = data[i*3 + 0];
b = data[i*3 + 1];
c = data[i*3 + 2];
if( (a>b) && (a>c) ) // This line makes data dependency
result[i]++;
}
我想删除数据依赖性以并行化此代码。 我知道我必须编辑我的代码,但不知道如何修复它。
我该如何修复此代码?
【问题讨论】:
-
我没有看到数据依赖关系,但是当您在方括号内进行数学索引时,有时编译器会感到困惑。只要您将 a、b 和 c 私有化,这应该是可并行的。由于您使用 openacc 标记了它,如果编译器告诉您由于数据依赖性而无法并行化,我建议使用
acc parallel loop而不是acc kernels。 -
实际上,我从另一个类似的代码中发现了数据依赖性(使用 NVVP)。但是作为这个示例代码,NVVP 并没有告诉我这会导致数据依赖。我认为我的真实代码的依赖是由其他原因引起的。我会尝试寻找其他原因。谢谢你的帮助,杰夫。 :)
-
要查找的两件事:1) 如果您正在访问多个数组,请确保将指针声明为
restrict,以便编译器知道它们没有别名。 2)方括号内的索引数学。
标签: c parallel-processing dependencies openacc