程序中需要用到500组数据,500组数据对应一个结构体A,每组数据分别经过5个函数模型后得到了5组计算结果,结果是存放在结构体B和C里面的,在CPU中B和C只需要声明为5个的长度就行了,而在GPU中,需要要把所有的结果500 x 5传递回主机端,然后都打印出来。
这里对B 和 C结构体我采用的是二维结构体。然后分配空间的时候是这样的:
struct vector **de_pos = NULL;
struct vector **de_vel = NULL;
CUDA_CALL(cudaMalloc((void **)&de_pos, sizeof(struct vector *) * 500));
for(q = 0; q < 500; q++)
{
CUDA_CALL(cudaMalloc((void **)&de_pos[q], sizeof(struct vector) * 5));
}
CUDA_CALL(cudaMalloc((void **)&de_vel, sizeof(struct vector *) * 500));
for(q = 0; q < 500; q++)
{
CUDA_CALL(cudaMalloc((void **)&de_vel[q], sizeof(struct vector) * 5));
}
kernel函数是这样定义的以及使用结构里面的成员
global void mykernel(int num, int model, struct tle_ascii *de_sat_data, struct vector **pos, struct vector **vel)
{
double delta = 360.0;
double tsince = 0.0;
struct DD satdata;
int tid = blockDim.x * blockIdx.x + threadIdx.x;
int x = 0;
while(tid < num)
{
tsince = (double)tid * delta;
Convert_function1(de_sat_data[tid], &satdata);
// if(tid == 0)
// printf(“satdata[%d] = %ld \n”, tid, satdata.xno);
for (x = 0; x < 5; x++)
{
tsince = x * delta;
if(model == 0)
{
s0(tsince, &pos[tid], &vel[tid], &satdata);
}
if(model == 1)
{
s1(tsince, &pos[tid], &vel[tid], &satdata);
}
if(model == 2)
{
s2(tsince, &pos[tid], &vel[tid], &satdata);
}
if(model == 3)
{
s3(tsince, &pos[tid], &vel[tid], &satdata);
}
if(model == 4)
{
s4(tsince, &pos[tid], &vel[tid], &satdata);
}
Convert_function2(&pos[tid], &vel[tid]);
pos[tid].v[3] = tsince;
}
tid += blockDim.x * gridDim.x;
}
}
然后调用kernel:
mykernel<<<256, 1024>>>(num, model, de_sat_data, de_pos, de_vel);//我就直接把节结构体指针这样传过去了
然后往主机端传值的时候是这样:
CUDA_CALL(cudaMemcpy(pos, de_pos, sizeof(struct vector *) * num, cudaMemcpyDeviceToHost));
CUDA_CALL(cudaMemcpy(vel, de_vel, sizeof(struct vector *) * num, cudaMemcpyDeviceToHost));
然后是打印部分。
这样哪里有问题?
我在编译的时候,没有报错,但是在执行的时候一直报段错误。段错误,段错误,段错误。。。。。。。
请问斑竹哪里出问题了?