有几个星期,我对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(...)超出界限”的问题。
显然有一些我不理解的东西,所以如果有人能告诉我并行化这些代码的方法,我会尝试理解我的错误
非常感谢