1

有几个星期我对 OpenACC 失去了理智!例如我必须并行化代码

float temp;
for( i_v = 0; i_v < ntv; i_v++ )
{
    temp = 0;

    for( i_el = 0; i_el < len_tv; i_el++ )
        temp += pow( tva[i_v*len_tv + i_el], (float)2.0 );

    tv_sq[i_v]=temp;
}    

为此,我尝试了几种方法,最后一种是在阅读Nvidia Technology Group之后很好地解释了gang和vector的功能。所以我尝试:

float temp;
#pragma acc data copyin(tva[:nfa]) copyout(tv_sq[:ntv]) create(temp)
{
    #pragma acc kernels loop independent 
        for( i_v = 0; i_v < ntv; i_v++ )
        {
            temp = 0;

            #pragma acc loop independent gang vector reduction(+:temp)
                for( i_el = 0; i_el < len_tv; i_el++ )
                    temp += pow( tva[i_v*len_tv + i_el], (float)2.0 );

            tv_sq[i_v]=temp;
        }
}

编译器说

 710, Generating create(temp)
     Generating copyout(tv_sq[0:ntv])
     Generating copyin(tva[0:nfa])
712, Loop is parallelizable
     Accelerator kernel generated
    712, #pragma acc loop gang /* blockIdx.x */
    716, #pragma acc loop vector(128) /* threadIdx.x */
712, Generating present_or_copyout(tv_sq[0:ntv])
     Generating present_or_copyin(tva[0:nfa])
     Generating NVIDIA code
     Generating compute capability 3.5 binary
716, Loop is parallelizable

但是当我尝试执行时:

Segmentation fault (core dumped)

与 cuda-memcheck 相同,它只回答分段错误。以前我以“并行”方式而不是“内核”插入编译指示,但我遇到了“大小为 8 的无效全局写入(...)越界”的问题。

显然有些东西我不明白,所以如果有人能告诉我并行化这些代码的方法,我会试着理解我的错误

非常非常感谢你

4

0 回答 0