gry*_*ypp 0 c struct cuda gpgpu openacc
我正在使用CAPS OpenACC编译器.我试图在OpenACC pragma行中的struct数据类型中使用动态数组.我的代码是这样的:
struct Structure{
int val[n];
int length;
int *valdyn;
};
#pragma acc parallel copyin(sa,sb) copyout(c[0:n])
{
#pragma acc loop
for (int i = 0; i < n; i++)
c[i] = sa.valdyn[i] + sb.valdyn[i];
}
Run Code Online (Sandbox Code Playgroud)
它编译成功.但当我试图跑,我得到了这些错误
terminate called after throwing an instance of 'hmpperr::DeviceError'
what(): cuCtxSynchronize() failed: Launch failed (700)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是有没有办法将结构数据类型与OpenACC一起使用?此外,我的情况对结构中的struct也有效:
struct Structure{
int val[20];
int length;
struct Other_Struct *Residue ;
int *valdyn;
};
Run Code Online (Sandbox Code Playgroud)
小智 5
在OpenACC中,您只能使用指向OpenACC数据子句中连续数据的指针 - 否则编译器不知道如何将数据复制到设备.通常,您可以使用Struct类型,只要它们没有指向其他数据结构的指针或数组即可.您必须将指针传递给val而不是指向保存它的结构的指针,例如:
struct Structure{
int val[n];
int length;
int *valdyn;
};
int * sa_valdyn = sa.valdyn;
int * sb_valdyn = sb.valdyn;
#pragma acc parallel copyin(sa_valdyn[0:n],sb_valdyn[0:n]) copyout(c[0:n])
{
#pragma acc loop
for (int i = 0; i < n; i++)
c[i] = sa_valdyn[i] + sb_valdyn[i];
}
Run Code Online (Sandbox Code Playgroud)
应该管用.另请注意,您需要知道valdyn的大小才能将数据复制到设备.