2013-05-16 35 views
0

我嘗試在內核代碼中創建一個設備全局內存數組,並在執行完成後,將數組內容傳遞給主機內存。是否可以動態地在設備代碼範圍創建全局內存數組,或者如果設備代碼評分爲全局數組,則是否需要在外側定義數組?如何在設備代碼中定義全局內存數組,並在執行後將值傳遞給主機?

__global__ void kernel_code(...,int array_size){ 
    __device__ int array_data[size]; 

    // fill the array_data 
    ... 
} 

int main(){ 
    //pass data from array_data to host array 
} 

是否有可能這樣做,如果它不是什麼最可能的做法?

回答

1

數組的分配必須能夠由編譯器靜態執行。所以你不能將它的大小聲明爲傳遞給內核的參數。

此外,__device__變量聲明是不是一個函數體內允許的。所以它必須在模塊的全局範圍內,而不是在功能範圍內。

除此之外,可以將靜態聲明裝置陣列和主機陣列之間傳遞數據。該__device__變量has the following characteristics

  • 駐留在全局內存空間,
  • 具有應用程序的生命週期,
  • 從電網中,並從主機 通過運行時庫中的所有線程訪問(cudaGetSymbolAddress ()/ cudaGetSymbolSize()/ cudaMemcpyToSymbol()/ cudaMemcpyFromSymbol())。

因此,在您的主機的代碼,你可以使用cudaMemcpyToSymbol將數據從主機數組傳輸到該設備陣列,並cudaMemcpyFromSymbol將數據從器件陣列轉移到主陣列。

對於動態尺寸器件陣列中,最常見的做法是使用像cudaMalloc和從主機陣列的裝置陣列或反之亦然傳輸數據的普通主機運行時的API函數使用cudaMemcpy

0

通常的做法來分配它們僅在內核中操作設備內存(速度要快得多)。只需使用cudaMemcpy(dst, src, cudaMemcpyDeviceToHost)將數據複製到主機內存(位於main())。

相關問題