I have this (working) CPU code:
#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;
}
Now I try a GPU version like this
#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;
}
but the assignment of device function pointers does not work.
Where is the mistake? And how it can be corrected?
Thanks you very much in advance.
Michele
Hope this will help someone