c - 在 OpenACC pragma 行中使用结构数据类型

标签 c struct cuda gpgpu openacc

我正在使用 CAPS OpenACC 编译器。我尝试在 OpenACC pragma 行中的结构数据类型内部使用动态数组。我的代码是这样的:

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];
} 

编译成功。但是当我尝试运行时,出现了这些错误

terminate called after throwing an instance of 'hmpperr::DeviceError'
  what():  cuCtxSynchronize() failed: Launch failed (700)

所以我的问题是,有什么方法可以将结构数据类型与 OpenACC 一起使用吗? 此外,我的案例也适用于这样的结构中的结构:

struct Structure{
    int val[20];
    int length; 
    struct Other_Struct *Residue ;
    int *valdyn;    
};

最佳答案

在 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];
}

应该可以。另请注意,您需要知道 valdyn 的大小才能将数据复制到设备。

关于c - 在 OpenACC pragma 行中使用结构数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21018273/

相关文章:

c++ - 对范围以及如何为目录树创建嵌套结构有点困惑

cuda - GPU 仿真器,无需硬件即可进行 CUDA 编程

C - 字符未在输出中正确显示

C编程练习?

c - 我可以假设结构字段按顺序放置并且没有填充吗?

c++ - CUDA:如何在设备上填充动态大小的 vector 并将其内容返回给另一个设备功能?

c++ - Cuda/c++ - Fortran - 对 Cuda 函数的 undefined reference

c - 在 realloc 之后组织指针数组

c - 将字符串写入文件会产生奇怪的字符

c - 在C中添加大量数字