2014-09-30 237 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