【发布时间】:2014-06-04 07:26:37
【问题描述】:
我正在尝试在设备上初始化一些结构,但是当它们返回时,它们都变得一团糟。我知道我使用指针的方式有问题,但我似乎无法弄清楚。
这是我在主机上的内存分配
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
我已经尝试了很长一段时间的不同方法,但似乎没有任何效果
【问题讨论】:
-
您似乎没有初始化
devBodyListpointer 数组。我可以看到您已经为它分配了存储空间,但我没有看到您将每个指针设置为指向某个东西的位置(例如body结构)。尝试在内核开头附近添加这一行:devBodyList[tid] = &(devBody[tid]);值得注意的是,将双指针 (**) 引用的数据传入或传出内核有些困难。搜索“CUDA 2D 阵列”。如果您使用cuda-memcheck运行代码,我想您可能会发现由于未初始化的指针而导致的一些越界访问。 -
是的,我初始化了那个变量。我只是没有把它放在我的帖子中。我编辑了我的帖子以更清楚。
-
你在哪里初始化数组中的每个指针?我知道您已经为设备上的一组指针分配了存储空间,但是在您可以在内核中取消引用其中一个指针之前,它必须指向有效的东西(在设备上)。您是否尝试使用
cuda-memcheck运行您的代码? -
*(devBodyList[tid]) = devBody[tid];这发生在我的内核内部
-
那是解除引用
devBodyList[tid]。但是devBodyList[tid]在哪里设置为合适的值?您似乎在为基本的 C 指针概念而苦苦挣扎,在这里。我向您保证,根据您在此处显示的内容,您正在取消引用内核中的无效指针。如果您不相信我,请尝试使用cuda-memcheck运行您的代码。将导致无效的全局写入错误是由于devBodyList[tid]未设置为正确的值。