2014-06-25 56 views
0

請注意,此共享內存陣列從不寫入,只能讀取。高效地初始化CUDA中的共享內存陣列

當我有它,我的共享內存被初始化,如:

__shared__ float TMshared[2592]; 
for (int i = 0; i< 2592; i++) 
{ 
TMshared[i] = TM[i]; 

} 
__syncthreads(); 

(TM傳遞到從內核啓動的所有線程)

您可能已經注意到,這是因爲有非常低效沒有進行並行化,並且同一個塊內的線程正在寫入相同的位置。

有人可以請推薦一個更有效的方法/評論,如果這個問題真的需要優化,因爲共享數組問題相對較小?

謝謝!

回答

4

使用所有線程編寫獨立的位置,它可能會更快。

實施例假定1D threadblock /格:

#define SSIZE 2592 

__shared__ float TMshared[SSIZE]; 

    int lidx = threadIdx.x; 
    while (lidx < SSIZE){ 
    TMShared[lidx] = TM[lidx]; 
    lidx += blockDim.x;} 

__syncthreads(); 
+0

NICE。 「#define SSIZE 2592」到底在哪裏?在cu文件的頂部,__global__內核之外? – Jordan

+0

另外,使用#define有什麼意義?它是否提供了一個優勢,而不是僅僅在適當的地方編碼2592? – Jordan

+2

是的,定義通常位於文件的頂部,但我確信您可以將它放在任何位置(在代碼中使用之前的任何位置)。沒有明確的代碼或性能優勢的定義與2592.然而,如果我改變我的共享內存陣列的大小,我只需要在一個地方改變它。 –