2017-07-12 19 views
1

我有一個長度爲128的向量;所有元素在整個計算過程中都是恆定傳遞一個恆定的共享內存

我喜歡在我的CUDA內核中使用這個常量向量。我正在考慮將此矢量存儲在共享內存中,並在內核中使用它。我想知道如何去?幾行代碼會很好。

或者這是最好的方法嗎?非常感謝。

我們可以與全球內存通過頭部的頂部:

__global__ void fun(float* a, float* coeff) 
{ 
    size_t 
     i = blockIdx.x * blockDim.x + threadIdx.x; 

    if (i >= 128) 
     return; 

    a[i] *= coeff[i]; 
} 

但是這可能不是最好的辦法。我想像

__shared__ float coeff[128]; 

但是,如何將CPU值複製到此共享內存?我將這個共享內存傳遞給我的內核?

+0

你從哪裏讀到共享內存?關於如何使用它沒有任何解釋嗎?您是否閱讀過Nvidia的[CUDA C編程指南](http://docs.nvidia.com/cuda/cuda-c-programming-guide/)? – Shadow

回答

3

__shared__無法直接從主機代碼訪問內存。所以你必須首先通過全局內存將數據傳遞給它,然後從那裏複製它(使用內核代碼)到__shared__的空間中。

一個簡單的修改內核代碼來說明這個概念是這樣的:

__global__ void fun(float* a, float* coeff) 
{ 
    __shared__ float scoeff[128]; 
    size_t 
     i = blockIdx.x * blockDim.x + threadIdx.x; 

    if (i >= 128) 
     return; 
    scoeff[i] = coeff[i]; 
    __syncthreads(); 

    a[i] *= scoeff[i]; 
} 

注:

  1. 有演示共享內存的更高級用法衆多CUDA示例代碼。

  2. 這裏的用法沒有任何好處。共享內存通常用於需要線程間通信的情況,或者在存在數據重用的情況下。你的代碼既不示範。

  3. 還有很多其他方式可以爲內核提供常量值,包括常量的數組,如__constant__內存。無論這些是否有益都將取決於您的實際使用情況和訪問模式,我認爲這些模式並不代表您所展示的代碼。在任何情況下,CUDA標籤上都有很多關於討論各種常量數據使用情況的問題,我相信您可以通過一些搜索找到它們。

  4. __syncthreads()對於此代碼來說可能是不必要的。但是在共享內存的許多更典型的用途中,這是必要的,所以我選擇在這裏指出。在這個特定的代碼中,這不是必要的,但是這個特定的代碼也不會是共享內存的合理使用。

+0

謝謝羅伯特。你總是很有幫助。 –