可以说我有一个数据结构:struct MyBigData { float * dataArray; float * targetArray; float * nodes; float * dataDataData;}我希望能够围绕一些各种CUDA内核传递此结构。我不想将多个数组作为参数传递,所以我可以只传递结构并完成它吗?我知道内核支持C结构,但是C结构中的动态内存又如何呢?看来我只是想在CUDA卡上制作结构:MyBigData * mbd = (MyBigData *) cudaMalloc( sizeof(MyBigData) );但是结构中数组的动态内存又如何呢?下面的代码行可以编译,但是会出现运行时错误:mbd->dataArray = (float *) cudaMalloc( 10 * sizeof(float) );这是因为cudaMalloc()在CPU上运行,并且它无法读取mdb-> dataArray来将指针设置为等于新的内存地址。因此,存在运行时错误。但是,这可以编译并运行,但似乎不是我想要的:MyBigData * mbd = (MyBigData *) malloc( sizeof(myBigData) );mbd->dataArray = (float *) cudaMalloc( 10 * sizeof(float) );因为现在尽管有效,但是mbd现在驻留在主系统内存中,并且float指针指向在CUDA设备上分配的内存。因此,我不能仅将指针传递给MyBigData结构,而必须将结构中的每个变量分别传递给内核。不干净。我想要的是:someKernel<<<1,1>>>(mbd);不:someKernel<<<1,1>>>(mbd->dataArray, mbd->targetArray, mbd->nodes, mbd->dataDataData);所以我在想,cudaMemcpy()呢?我在想这个:MyBigData *d_mbd = cudaMemcpy( (void*) &d_mbd, (void*) mbd, SOMESIZE, CudaHostToDevice);但是,我该如何选择SOMESIZE?我不能使用sizeof(MyBigData),因为它将包括浮点指针的大小,而不是数组的实际大小。其次,cudaMemcpy()是否足够聪明,可以深入研究复杂数据结构的子对象?我觉得不是。因此,不可能在CUDA卡上具有包含动态内存的结构吗?还是我错过了什么。最简单的方法是让CUDA内核分配一些内存,但是您不能从CUDA内核调用cudaMalloc()。有什么想法吗?5月7日更新:我编写了这段代码,并进行了编译,但是它告诉我所有值均为零。我想我正在正确创建对象,并使用CUDA内核正确填充值。这些值只是线程ID。我怀疑我没有正确打印值。有什么想法吗?谢谢你!MyBigData* generateData(const int size) { MyBigData *mbd_host, *mbd_cuda; mbd_host = (MyBigData *) malloc( sizeof(MyBigData) ); cudaMalloc( (void**) &mbd_host->dataArray, size * sizeof(float) ); cudaMalloc( (void**) &mbd_host->targetArray, size * sizeof(float) ); cudaMalloc( (void**) &mbd_host->nodes, size * sizeof(float) ); cudaMalloc( (void**) &mbd_host->dataDataData, size * sizeof(float) ); cudaMalloc( (void**) &mbd_cuda, sizeof(MyBigData) ); cudaMemcpy( mbd_cuda, mbd_host, sizeof(mbd_host), cudaMemcpyHostToDevice ); free(mbd_host); return mbd_cuda;}void printCudaData(MyBigData* mbd_cuda, const int size) { MyBigData *mbd; cudaMemcpy( mbd, mbd_cuda, sizeof(mbd_cuda), cudaMemcpyDeviceToHost); MyBigData *mbd_host = (MyBigData *) malloc( sizeof(MyBigData)); mbd_host->dataArray = (float*) malloc(size * sizeof(float)); mbd_host->targetArray = (float*) malloc(size * sizeof(float)); mbd_host->nodes = (float*) malloc(size * sizeof(float)); mbd_host->dataDataData = (float*) malloc(size * sizeof(float)); cudaMemcpy( mbd_host->dataArray, mbd->dataArray, size * sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy( mbd_host->targetArray, mbd->targetArray, size * sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy( mbd_host->nodes, mbd->nodes, size * sizeof(float), cudaMemcpyDeviceToHost); cudaMemcpy( mbd_host->dataDataData, mbd->dataDataData, size * sizeof(float), cudaMemcpyDeviceToHost); for(int i = 0; i < size; i++) { printf("data[%i] = %f\n", i, mbd_host->dataArray[i]); printf("target[%i] = %f\n", i, mbd_host->targetArray[i]); printf("nodes[%i] = %f\n", i, mbd_host->nodes[i]); printf("data2[%i] = %f\n", i, mbd_host->dataDataData[i]); } free(mbd_host->dataArray); free(mbd_host->targetArray); free(mbd_host->nodes); free(mbd_host->dataDataData); free(mbd_host);}这是我的内核以及调用它的函数:__global__ void cudaInitData(MyBigData* mbd) { const int threadID = threadIdx.x; mbd->dataArray[threadID] = threadID; mbd->targetArray[threadID] = threadID; mbd->nodes[threadID] = threadID; mbd->dataDataData[threadID] = threadID;}void initData(MyBigData* mbd, const int size) { if (mbd == NULL) mbd = generateData(size); cudaInitData<<<size,1>>>(mbd);}我的main()呼叫:MyBigData* mbd = NULL;initData(mbd, 10);printCudaData(mbd, 10); 最佳答案 其次,cudaMemcpy()是否足够聪明,可以深入研究复杂数据结构的子对象?我觉得不是。没错,cudaMemcpy()不会进行递归复制。要实现您想要的,您应该执行以下操作:// Create mbd on hostMyBigData *mbd_host, *mbd;mbd_host = (MyBigData *) malloc( sizeof(myBigData) );// Fill it with pointers to device arrayscudaMalloc( &mbd_host->dataArray, 10 * sizeof(float) );// etc for other structure fields// Create mbd on devicecudaMalloc( &mbd, sizeof(MyBigData) );// Copy structure, filled with device addresses, to device memorycudaMemcpy( mbd, mbd_host, sizeof(mbd), cudaMemcpyHostToDevice );// Voila!顺便说一句,最好将MyBigData结构存储在设备的__global__内存中(而不是__constant__)(您必须声明一个常量,而不是用mbd分配cudaMalloc并使用,而不是最后一个cudaMemcpyToSymbol)关于c - 具有CUDA内核的动态数据的C结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10456330/
10-11 20:39