For loop 并行编程依赖openacc

For loop 并行编程依赖openacc,for-loop,parallel-processing,openacc,For Loop,Parallel Processing,Openacc,我正在尝试并行化这个循环,但是在PGI编译器中出现了一些错误,我不明白是什么错了 #pragma acc kernels { #pragma acc loop independent for (i = 0;i < k; i++) { for(;dt*j <= Ms[i+1].t;j++) { w = (j*dt - Ms[i].t)/(Ms[i+1].t-Ms[i].t); X[j] =

我正在尝试并行化这个循环,但是在PGI编译器中出现了一些错误,我不明白是什么错了

#pragma acc kernels
{
#pragma acc loop independent
    for (i = 0;i < k; i++)
    {
        for(;dt*j <= Ms[i+1].t;j++)
        {
            w = (j*dt - Ms[i].t)/(Ms[i+1].t-Ms[i].t);
            X[j] = Ms[i].x*(1-w)+Ms[i+1].x*w;
            Y[j] = Ms[i].y*(1-w)+Ms[i+1].y*w;
        }
    }
}
#pragma acc内核
{
#pragma acc环路独立
对于(i=0;ix,x->,Ms->y,y->防止并行化
循环携带的Y->,X->重用阻止了并行化

那么,我能做些什么来解决这个依赖性问题呢?

这很可能通过添加独立于内部循环的循环,或者使用collapse子句来平铺循环,并对两者应用独立性来解决。如果使用
restrict
传入所有数组,也可能会消失,但可能不会。

我看到一些问题同样给出了输出,我假设您使用“-ta=multicore,tesla”进行编译(即,同时针对多核CPU和GPU)

首先,由于“j”未在“i”循环中初始化,“j”的起始值将取决于“i”上一次迭代中“j”的结束值。因此,通过使用“循环独立”,循环不可并行化,您已经强制在外循环上进行并行化,但按顺序运行代码会得到不同的答案。您需要重新考虑您的算法

我建议将X和Y设置为二维。第一个维度的大小为“k”。第二个维度可以是锯齿状数组(即每个数组的大小不同),其大小对应于“Ms[I+1].t”值

我在《OpenACC并行编程》一书的第(5)章中写了一个使用锯齿阵列的例子。请参阅:

或者,如果设置了“Ms[0].t”,则可以设置“j=Ms[i].t”


另一件需要记住的事情是指针别名。在C/C++中,相同类型的指针可以指向相同的对象。因此,不需要附加信息,例如“restrict”属性、“independent”子句或PGI编译器标志“-Msafeptr”,编译器必须假设您的指针指向同一个对象,从而使循环不可并行。

您好,我更改了代码并出现错误,#pragma acc内核copyin(TEMPX[1:k],TEMPY[1:k],test[1:k],MLX[1:k],MLY[1:k],w[1:k])copyout(X[1:N],Y[1:N{])pragma acc循环独立于(int i=0;ifor(j=Ms[i].t;dt*j <= Ms[i+1].t;j++)
#pragma acc kernels copyout(X[0:size], Y[0:size]) 
 #pragma acc data copyout(X[0:size], Y[0:size])
 {
    ...
    #pragma acc kernels 
    ...
 }