Cuda 作为结构成员的设备函数指针

Cuda 作为结构成员的设备函数指针,cuda,gpu,Cuda,Gpu,我有以下(工作)CPU代码: #define NF 3 int ND; typedef double (*POT)(double x, double y); typedef struct { POT pot[NF]; } DATAMPOT; DATAMPOT *datampot; double func0(double x, double y); double func1(double x, double y); double func2(double x, double y);

我有以下(工作)CPU代码:

#define NF 3
int ND;

typedef double (*POT)(double x, double y);

typedef struct {
    POT pot[NF];
} DATAMPOT;

DATAMPOT *datampot;

double func0(double x, double y);
double func1(double x, double y);
double func2(double x, double y);


int main(void)
{
    int i;

    ND=5;
    datampot=(DATAMPOT *)malloc(ND*sizeof(DATAMPOT));

    for(i=0;i<ND;i++){
        datampot[i].pot[0]=func0;
        datampot[i].pot[1]=func1;
        datampot[i].pot[2]=func2;
    }

    return 0;
}
#定义NF 3
int-ND;
typedef double(*POT)(双x,双y);
类型定义结构{
罐罐[NF];
}数据输入;
DATAMPOT*DATAMPOT;
双功能0(双x,双y);
双功能1(双x,双y);
双功能2(双x,双y);
内部主(空)
{
int i;
ND=5;
datampot=(datampot*)malloc(ND*sizeof(datampot));
对于(i=0;ipot[1]=z_func1;
(dmp+i)->pot[2]=z_func2;
}
}
内部主(空)
{
int i;
ND=5;
Cudamaloc((void**)和dev_datampot,ND*sizeof(datampot));
分配(开发数据导入,ND);
返回0;
}
但是设备函数指针的分配不起作用。 错误在哪里?如何纠正? 事先非常感谢你。
Michele

您的编译器选项是什么?在计算能力为1.3或更低的设备上,设备函数必须是内联的,因此您不能使用设备函数指针。

根据

D.2.4.3函数指针

主机代码中支持指向
\uuuuu全局\uuuu
函数的函数指针,但设备代码中不支持

只有在为具有计算能力2.x的设备编译的设备代码中,才支持指向
\uuuu设备\uuuu
函数的函数指针

不允许在主机代码中获取
\uuu设备\uuuu
函数的地址


我猜你是在为低于2.0的计算能力进行编译。

希望这能帮助别人

#define NF 3
int ND;

typedef double (*POT)(double x, double y);

typedef struct {
    POT pot[NF];
} DATAMPOT;

DATAMPOT *dev_datampot;

__device__ double z_func0(double x, double y);
__device__ double z_func1(double x, double y);
__device__ double z_func2(double x, double y);

//Static pointers to the above device functions    
__device__ POT z_func0_pointer=z_func0;  
__device__ POT z_func1_pointer=z_func1;
__device__ POT z_func2_pointer=z_func2;



int main(void)
{
    int i;
    POT pot_pointer;

    ND=5;
    cudaMalloc((void**)&dev_datampot,ND*sizeof(DATAMPOT));

    for(i=0;i<ND;++i){  
     cudaMemcpyFromSymbol( &pot_pointer,z_func0_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[0]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);

     cudaMemcpyFromSymbol( &pot_pointer,z_func1_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[1]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);

     cudaMemcpyFromSymbol( &pot_pointer,z_func2_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[2]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);
    }

    return 0;
}
#定义NF 3
int-ND;
typedef double(*POT)(双x,双y);
类型定义结构{
罐罐[NF];
}数据输入;
数据导入*dev_数据导入;
__设备双z函数0(双x,双y);
__设备双z功能1(双x,双y);
__设备双z函数2(双x,双y);
//指向上述设备函数的静态指针
__device_uuuuupot z_func0_指针=z_func0;
__device_uuuuupot z_func1_指针=z_func1;
__device_uuuuupot z_func2_指针=z_func2;
内部主(空)
{
int i;
壶型指针;
ND=5;
Cudamaloc((void**)和dev_datampot,ND*sizeof(datampot));

对于(i=0;更具体地说,它是如何工作的?编译器是否报告错误?我使用GeForce GTS 450,计算能力2.1。在我完成Cudamaloc((void**)和dev_datampot,ND*sizeof(datampot))之后;是否有可能将成员数组pot的三个函数指针链接到设备函数z_func1、z_func2、z_func3?@micheletuttafesta:您必须从设备函数中执行此操作,这就是您在示例中所做的。您是否为compute capability 2.0进行编译,例如使用
-arch=sm_20
?对不起,我已经很晚了wer Pedro…是的,我使用-arch=sm_20选项编译。不过,我可能已经找到了问题的解决方案。我会尽快编写它
#define NF 3
int ND;

typedef double (*POT)(double x, double y);

typedef struct {
    POT pot[NF];
} DATAMPOT;

DATAMPOT *dev_datampot;

__device__ double z_func0(double x, double y);
__device__ double z_func1(double x, double y);
__device__ double z_func2(double x, double y);

//Static pointers to the above device functions    
__device__ POT z_func0_pointer=z_func0;  
__device__ POT z_func1_pointer=z_func1;
__device__ POT z_func2_pointer=z_func2;



int main(void)
{
    int i;
    POT pot_pointer;

    ND=5;
    cudaMalloc((void**)&dev_datampot,ND*sizeof(DATAMPOT));

    for(i=0;i<ND;++i){  
     cudaMemcpyFromSymbol( &pot_pointer,z_func0_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[0]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);

     cudaMemcpyFromSymbol( &pot_pointer,z_func1_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[1]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);

     cudaMemcpyFromSymbol( &pot_pointer,z_func2_pointer, sizeof( POT ) );
  cudaMemcpy(&dev_datampot[i].pot[2]),&pot_pointer,sizeof(POT),cudaMemcpyHostToDevice);
    }

    return 0;
}