2013-04-17 47 views
0

所以我試圖從主機複製鋸齒陣列到設備。首先這裏是我目前對cudaMalloc和cudaMemcpy的理解:CUDA將鋸齒陣列從主機複製到設備

cudaMalloc需要一個指向內存塊的指針。

cudaMemcpy將一個指向內存塊的指針複製到或從中複製。

請糾正我,如果我錯了。

現在,這是我的代碼不能正常工作(編譯罰款,但沒有輸出):

__global__ void kernel(int** arr) 
{ 
    for (int i=0; i<3; i++) 
    printf("%d\n", arr[i][0]); 
} 

int main() 
{ 
    int arr[][3] = {{1},{2},{3}}; // 3 arrays, 1 element each 

    int **d_arr; 

    cudaMalloc((void**)(&d_arr), sizeof(int*)*3); // allocate for 3 int pointers 

    for (int i=0; i<3; i++) 
    { 
    cudaMalloc((void**) &(d_arr[i]), sizeof(int) * 1); // allocate for 1 int in each int pointer 

    cudaMemcpy(d_arr[i], arr[i], sizeof(int) * 1, cudaMemcpyHostToDevice); // copy data 
    } 

    kernel<<<1,1>>>(d_arr); 

    cudaDeviceSynchronize(); 
    cudaDeviceReset(); 
} 

那我錯在這裏做什麼? 乾杯

回答

1

我發現了原因,這是因爲cudaMalloc和cudaMemcpy預計存在於主機而不是設備上的指針。

在我的for循環中,我試圖在主機上運行的代碼中填寫設備上存在的指針!

正確的方法是製作一箇中間變量,一個指向設備內存的主機上的指針,用整數填充它,然後將該指針複製到鋸齒狀數組(指針上的指針)!

這是正確的版本:

__global__ void kernel(int** arr) 
{ 
    for (int i=0; i<3; i++) 
     printf("%d\n", arr[i][0]); 
} 

int main() 
{ 
    int arr[][3] = {{1},{2},{3}}; // 3 arrays, 1 element each 

    int **d_arr; 

    cudaMalloc((void***)(&d_arr), sizeof(int*)*3); // allocate for 3 int pointers 

    for (int i=0; i<3; i++) 
    { 

     int* temp; 

     cudaMalloc((void**) &(temp), sizeof(int) * 1); // allocate for 1 int in each int pointer 

     cudaMemcpy(temp, arr[i], sizeof(int) * 1, cudaMemcpyHostToDevice); // copy data 

     cudaMemcpy(d_arr+i, &temp, sizeof(int*), cudaMemcpyHostToDevice); 
    } 

    kernel<<<1,1>>>(d_arr); 

    cudaDeviceSynchronize(); 
    cudaDeviceReset(); 
} 
0
  1. 你的內核調用printf(),其中 曾經是(直到CC2.0)主機功能。一切都還好。 ;)

  2. cudaMemcpy((void*)d_arr, (void*)arr, sizeof(int*)*3, cudaMemcpyHostToDevice);將主機上的陣列的存儲器地址複製到設備。這是沒有意義的。由於您現在有指向設備上主機內存的指針。

  3. 您不能在CUDA中以特定方式分配2d陣列。見http://www.stevenmarkford.com/allocating-2d-arrays-in-cuda/

+0

1-不,你可以在設備上使用'printf()'。 2-你說得對。 3-檢查我的答案。 4-謝謝,我會讀一讀。 –

+0

1.你說得對,從計算能力2 - 實際上是可能的。 2. - 3.「這種方式」並不是指你的答案,而是你的問題。 ;)4.不客氣。 – Pixelchemist