我有这个(工作)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;
}
现在我尝试像这样的GPU版本
#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);
__global__ void assign(DATAMPOT *dmp, int n)
{
int i;
for(i=0;i<n;i++){
(dmp+i)->pot[0]=z_func0;
(dmp+i)->pot[1]=z_func1;
(dmp+i)->pot[2]=z_func2;
}
}
int main(void)
{
int i;
ND=5;
cudaMalloc((void**)&dev_datampot,ND*sizeof(DATAMPOT));
assign<<<1,1>>>(dev_datampot,ND);
return 0;
}
但设备功能指针的分配不起作用。 哪里出错了?它是如何纠正的? 非常感谢你提前。 米歇尔
答案 0 :(得分:1)
D.2.4.3功能指针
主机代码支持
__global__
函数的函数指针,但不支持设备代码。
__device__
函数的函数指针仅在为计算能力2.x的设备编译的设备代码中受支持。不允许在主机代码中获取
__device__
函数的地址。
我的猜测是你正在编译一个低于2.0的计算能力。
答案 1 :(得分:1)
希望这会有所帮助
#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;
}
答案 2 :(得分:0)
您的编译器选项是什么?在计算容量为1.3或更低的设备上,必须内联设备功能,因此不能使用设备功能指针。