2014-09-27 60 views
1

我需要將128到256個字節的數組加載到GPU共享內存中。 我想盡量減少全局內存訪問,同時高效地執行按位操作。我們來解釋一下。如何使用GPGPU高效地執行加載和按位操作?

我有一個256字節的數組加載到全局內存,我想在內核代碼的開始加載所有的256字節共享內存。

然後,在每個字節上執行按位操作,而此操作可應用於兩個一個字節變量,兩個2個字節變量或兩個4個字節或更大的變量。 的問題是:

  1. 如果我加載每個線程的陣列的16字節那麼我只有一個(經大小)*(16字節)的數據或爲每個線程 4字節的最好辦法 內存訪問?
  2. 如果我將每個線程加載16bytes到共享內存,那麼我將這個16bytes與一個相同的16bytes變量設置爲1?
  3. 如果我每個線程加載16個字節,那麼對16字節數據類型的OR操作會更快,還是4bytes數據類型或更小的數據類型?

例如欲第三位設置爲1個

__shared__ (which data type?) temp = ((which data type?) *)array[i]; 
    temp |= (a variable with third bit set to 1) 

陣列位於全局存儲器和欲通過最小全局存儲器訪問加載到共享存儲器。

+0

你真的需要共享內存:與開普勒開始,你可以通過調用cudaDeviceSharedMemConfig()

Acceleware公司對主題一個很好的資源指定的64位的銀行規模? (你是否在整個內核中重用'temp',或者立即將結果存儲回全局?)如果是,請使用您配置共享內存條的任何大小(默認值爲4個字節)。低於這個值會使性能達不到最佳狀態(當你在4個字節上同時執行1或1操作時,沒有必要在1個字節上執行4個或4個或更高的操作數),高於這會導致銀行衝突。所以,假設你的銀行是4字節的默認值,那麼使用'uint32_t'來進行按位操作。 – 2014-09-27 12:15:14

+0

是的我需要,因爲線程加載的字節可能會與其他線程一起使用。我需要對加載數據的一個字節執行按位操作,以共享內存。因此,我想知道如何以最小的內存訪問將數據加載到共享內存,並對這些字節執行按位操作。 – kiki 2014-09-27 18:40:02

回答