在OpenACC pragma行内部使用struct数据类型

在OpenACC pragma行内部使用struct数据类型,c,struct,cuda,gpgpu,openacc,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;

我正在使用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];
} 
struct Structure{
    int val[20];
    int length; 
    struct Other_Struct *Residue ;
    int *valdyn;    
};
所以我的问题是,有没有办法将struct数据类型与OpenACC一起使用? 此外,我的案例也适用于struct中的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];
} 
struct Structure{
    int val[20];
    int length; 
    struct Other_Struct *Residue ;
    int *valdyn;    
};

在OpenACC中,只能使用指向OpenACC数据子句中连续数据的指针,否则编译器不知道如何将数据复制到设备。 通常,您可以使用结构类型,只要它们没有指向其他数据结构的指针或数组。 您必须向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];
}
struct结构{
int val[n];
整数长度;
int*valdyn;
};
int*sa_valdyn=sa.valdyn;
int*sb_valdyn=sb.valdyn;
#pragma acc并行copyin(sa_valdyn[0:n],sb_valdyn[0:n])copyout(c[0:n])
{
#pragma-acc环
对于(int i=0;i

应该有用。还请注意,要将数据复制到设备,您需要知道valdyn的大小。

在OpenACC中,您只能使用指向OpenACC数据子句中连续数据的指针,否则编译器不知道如何将数据复制到设备。 通常,您可以使用结构类型,只要它们没有指向其他数据结构的指针或数组。 您必须向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];
}
struct结构{
int val[n];
整数长度;
int*valdyn;
};
int*sa_valdyn=sa.valdyn;
int*sb_valdyn=sb.valdyn;
#pragma acc并行copyin(sa_valdyn[0:n],sb_valdyn[0:n])copyout(c[0:n])
{
#pragma-acc环
对于(int i=0;i

应该有用。另外请注意,您需要知道valdyn的大小,以便将数据复制到设备。

感谢您的回答@Ruyk。所以只使用连续数据传输是OpenACC标准,对吗?是的。否则,编译器要想知道如何将数据复制到设备上会非常复杂。你说得对。编译器将在分析阶段进行大量工作,以确定复制数据。所以,让我们拭目以待,看看cuda 6.0:)但我不知道,OpenCL的统一内存是怎么回事。也许已经宣布了。谢谢你的回答@Ruyk。所以只使用连续数据传输是OpenACC标准,对吗?是的。否则,编译器要想知道如何将数据复制到设备上会非常复杂。你说得对。编译器将在分析阶段进行大量工作,以确定复制数据。所以,让我们拭目以待,看看cuda 6.0:)但我不知道,OpenCL的统一内存是怎么回事。也许已经宣布了。