2014-09-30 77 views
-2

我在使用cuda中的指针指针时遇到问题。 代码片段如下。如何在cuda中使用指向指针的指针

char** d_ppcPtr, *d_pcPtr, *h_pcPtr; 
cudaMalloc(&d_ppcPtr, sizeof(char*) * 10); 

h_pcPtr = (char*)malloc(sizeof(char) * 100); 
for(int i = 0; i < 10; i ++) 
{ 
     cudaMalloc(&d_pcPtr, sizeof(char) * 100); 
     cudaMemset(d_pcPtr, 1, sizeof(char) * 100); 
     cudaMemcpy(&d_ppcPtr[i], &d_pcPtr, sizeof(char*), cudaMemcpyHostToDevice); 
     cudaMemcpy(h_pcPtr, d_ppcPtr[i], sizeof(char) * 100, cudaMemcpyDeviceToHost); //crash here 
     cudaFree(d_ppcPtr[i]); //crash also here 
} 
cudaFree(d_ppcPtr); 

我该如何修复以上两次崩溃? 在此先感谢。

+0

什么样的崩溃?段错误?错误讯息? – skrrgwasme 2014-09-30 02:49:03

+0

在d_ppcPtr [i]地址读取访问冲突。 – 2014-09-30 02:53:40

+0

您是否分配了'd_ppcPtr [i]'应该指向的内存空间? – JackOLantern 2014-09-30 06:46:29

回答

1

以下修改将“修理”你的代码(整个例子,包括主机和设备验证):

$ cat t583.cu 
#include <stdio.h> 

__global__ void testkernel(char **data, unsigned n){ 
    for (int i = 0; i < 100; i++) if (data[n][i] != 1) printf("kernel error\n"); 
} 

int main(){ 
    char** d_ppcPtr, *d_pcPtr, *h_pcPtr; 
    cudaMalloc(&d_ppcPtr, sizeof(char*) * 10); 

    h_pcPtr = (char*)malloc(sizeof(char) * 100); 
    for(int i = 0; i < 10; i ++) 
    { 
     cudaMalloc(&d_pcPtr, sizeof(char) * 100); 
     cudaMemset(d_pcPtr, 1, sizeof(char) * 100); 
     cudaMemcpy(&d_ppcPtr[i], &d_pcPtr, sizeof(char*), cudaMemcpyHostToDevice); 
     memset(h_pcPtr, 0, sizeof(char)*100); 
     testkernel<<<1,1>>>(d_ppcPtr, i); 
     cudaMemcpy(h_pcPtr, d_pcPtr, sizeof(char) * 100, cudaMemcpyDeviceToHost); 
     cudaFree(d_pcPtr); 
     for (int i = 0; i < 100; i++) if (h_pcPtr[i] != 1) printf("Error!"); 
    } 
    cudaFree(d_ppcPtr); 
} 
$ nvcc -arch=sm_20 -o t583 t583.cu 
$ cuda-memcheck ./t583 
========= CUDA-MEMCHECK 
========= ERROR SUMMARY: 0 errors 

注意,在概念上,有我的代码和你之间没有区别,因为指针您正试图在位置d_ppcPtr[i]中使用(并正在崩溃,因为它位于设备上)已经包含在主机上的d_pcPtr中。

+0

非常感谢Robert Crovella。 明确回答! – 2014-10-01 07:50:26

+0

不应'cudaMemcpy(&d_ppcPtr [i],&d_pcPtr,sizeof(char *),cudaMemcpyHostToDevice);'使用'cudaMemcpyDeviceToDevice'? d_ppcPtr和d_pcPtr都是'cudaMalloc'ed,这意味着它们都在设备上。或者我错过了什么? – 2017-12-01 00:37:25

+0

是的,你错过了一些东西,'d_pcPtr'确实是'cudaMalloc'ed,但是这里的传输不是来自'd_pcPtr',而是来自'&d_pcPtr',我保证你是一个主机指针。如果传输方向错误,'cuda-memcheck'也会吐出一个错误。如果不清楚,我们不要在评论中尝试对其进行分类。随意尝试一下吧。这是一个深层复制操作,您可能无法掌握。 – 2017-12-01 01:15:59