我正在研究这个简单的代码片段 顺便说一句,我用0初始化了c数组的所有元素。
#pragma acc kernels copyin(a[0:n],b[0:n]), copyout(c[0:n])
{
c[0]=11;
for(i=0; i<n; i++) {
if(c[i]==11) c[i]=123;
c[i] = a[i] + b[i];
}
}
当我查看生成的codelet时,我看到在主机代码段(CPU)上分配了c [0]。这意味着迭代适用于旧的c值(初始化值为0)。因此,迭代从未进入c [i] = 123赋值。我的意思是代码返回错误的结果:( 你有没有遇到过这样的事情?
答案 0 :(得分:3)
根据OpenACC v1.0 reference, acc内核指令围绕要在加速器上执行的循环,通常作为一系列内核操作。 这意味着循环外的代码不一定必须在加速器中并行运行。 在您的情况下,最好使用 acc parallel 指令:
#pragma acc parallel copyin(a[0:n],b[0:n]), copyout(c[0:n])
{
c[0]=11;
#pragma acc loop
for(i=0; i<n; i++) {
if(c[i]==11) c[i]=123;
c[i] = a[i] + b[i];
}
}
acc loop 指令确保循环的迭代分布在加速器线程中。