【问题标题】:Using struct datatype inside of OpenACC pragma line在 OpenACC 杂注行中使用 struct 数据类型
【发布时间】:2014-01-27 21:20:00
【问题描述】:

我正在使用 CAPS OpenACC 编译器。我尝试在 OpenACC 编译指示行中的 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];
} 

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

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

所以我的问题是,有什么方法可以将 struct 数据类型与 OpenACC 一起使用? 此外,我的情况也适用于 struct in struct 这样的:

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

【问题讨论】:

    标签: c struct cuda gpgpu openacc


    【解决方案1】:

    在 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 的大小才能将数据复制到设备。

    【讨论】:

    • 感谢@Ruyk 的回答。所以只使用连续的数据来传输是 OpenACC Standart,对吧?
    • 是的。否则编译器要弄清楚如何将数据复制到设备将非常复杂。
    • 你是对的。编译器在分析阶段会做很多工作来决定复制数据。那么让我们拭目以待 cuda 6.0 :) devblogs.nvidia.com/parallelforall/wp-content/uploads/sites/3/… 但我不知道,OpenCL 方面的统一内存发生了什么。也许它已经宣布了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多