2012-09-09 63 views
1

的討論被限制於計算能力2.x的3約對準問題

問題1

一個curandState的大小爲48個字節(由測量的sizeof())。當一個curandState數組被分配時,每個元素是否被填充(例如,到64個字節)?或者他們只是連續地放在記憶中?

問題2

Passing structs to CUDA kernels的OP的規定, 「對準部分是不必要的」。但如果沒有對齊,訪問該結構將被分爲兩個連續訪問a和b。對?

問題3

struct 
{ 
    double x, y, z; 
}Position 

假設每個線程正在訪問上面的結構:

int globalThreadID=blockIdx.x*blockDim.x+threadIdx.x; 
Position positionRegister=positionGlobal[globalThreadID]; 

爲了優化存儲器存取,我應該簡單地使用三個獨立的雙變量X,Y,Z,以替換結構?

謝謝你的時間!

回答

1

(1)它們被連續放置在內存中。 (2)如果數組在全局內存中,每個內存事務是128個字節,對齊到128個字節。只有在ab碰巧跨越128字節的邊界時,纔會獲得兩筆交易。

(3)性能通常可以通過使用數組結構而不是結構數組來提高。這只是意味着你將所有x放在一個數組中,然後y等等。當你看一下當一個warp中的所有32個線程達到需要的地方,例如x時,會發生什麼情況。通過將所有值打包在一起,可以使用盡可能少的事務來處理warp中的所有線程。由於全局內存事務是128字節,這意味着如果值是32位字,則單個事務可以爲所有線程提供服務。您提供的代碼示例可能會導致編譯器將值保存在寄存器中直到需要它們。