使用OpenACC的GPU上的嵌套循环返回分段错误

时间:2014-02-14 01:15:42

标签: openacc

有几个星期,我对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之后的最后一种方式,很好地解释了帮派和向量的功能。所以我试试:

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相同,它只回答分段错误。以前我以“并行”的方式插入pragma而不是“kernels”,但我遇到了“无效全局写入大小为8(...)超出界限”的问题。

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

非常感谢

0 个答案:

没有答案