我试图初始化设备上的一些结构,但是当它们回来时,它们都是混乱的。我知道我使用指针的方式有问题,但我似乎无法解决这个问题。传入内核的值越来越混乱
继承人的主机
body* devBodies;
body** devBodyList;
float* devRandoms;
cudaMalloc((void**)&devBodies, n * sizeof(body));
cudaMalloc((void**)&devBodyList, n * sizeof(body*));
cudaMalloc((void**)&devRandoms, n * 3 * sizeof(float));
我的继承人函数调用,其中devRandoms只是一个浮动的名单上我的内存分配。
CUDAInitBodies<<<n,1>>>(devBodyList, devBodies, devRandoms);
和继承人我的方法:
__global__ void CUDAInitBodies(body** devBodyList, body* devBody, float* rand)
{
int j;
int tid = blockIdx.x;
*(devBodyList[tid]) = devBody[tid];
devBodyList[tid]->id = tid;
devBodyList[tid]->m = 10;
for(j = 0; j < 3; j++)
{
devBodyList[tid]->a[j] = 0;
devBodyList[tid]->v[j] = 0;
devBodyList[tid]->pos[j] = rand[(tid * 3) + j];
}
}
当我然后将数据复制回主机:
body* bodies = (body*)malloc(n * sizeof(body));
cudaMemcpy(bodies, devBodies, n * sizeof(body), cudaMemcpyDeviceToHost);
当我打印出我的“身体”的变量,我得到这个:
====BODY[-581043205]====
M = -42522218781525353518415985938704367616.000000
V = [-311601248975690312470654313562112.000000, 17269896096570671104.000000, 307939529506715418513587721849804947456.000000]
X = -19247336126697914498972549714433540096.000000
Y = 17731266573644159438123340575306416128.000000
Z = -544771403677696.000000
我试过differen牛逼这样做了很长一段时间的办法,但似乎没有任何可以做的伎俩
看起来你并没有初始化'devBodyList'指针数组,我可以看到你已经为它分配了存储空间,但是我没有看到在你设置每个指针指向某些东西的地方(比如一个'body'结构体),试着在你的内核开头附近添加这行:'devBodyList [tid] =&(devBody [tid]);'值得注意的是它将通过双指针('**')引用的数据传递给或fr一个内核有点困难。在“CUDA 2D阵列”上搜索。如果你用'cuda-memcheck'运行你的代码,我想你可能会发现由于单位化指针引起的一些越界访问。 –
是的,我初始化了这个变量。我只是没有把它放在我的帖子中。我编辑我的帖子更清晰。 –
你在哪里初始化数组中的每个指针?我知道你已经为设备上的指针数组分配了存储空间,但是在你可以在你的内核中取消引用其中的一个指针之前,它必须指向一些有效的(在设备上)。你有没有尝试用'cuda-memcheck'运行你的代码? –