我需要一些幫助理解的羅恩·法伯的代碼的行爲:http://www.drdobbs.com/parallel/cuda-supercomputing-for-the-masses-part/208801731?pgno=2爲什麼全球+共享的速度比全球獨自
我不理解如何使用共享MEM的是給在非共享內存更快的性能版。即,如果我再添加一些索引計算步驟並使用另一個Rd/Wr循環來訪問共享內存,那麼如何比單獨使用全局內存更快?在這兩種情況下,相同的數字或Rd/Wr循環訪問全局內存。每個內核實例只能訪問一次數據。數據仍然使用全局內存進/出。內核實例的數量是相同的。寄存器數量看起來是一樣的。如何添加更多的處理步驟使其更快。 (我們沒有減去任何流程步驟。)基本上我們正在做更多的工作,並且它正在更快地完成。
共享內存訪問速度比全球快得多,但它不是零(或負值)。 我錯過了什麼?
的「慢」的代碼:
__global__ void reverseArrayBlock(int *d_out, int *d_in) {
int inOffset = blockDim.x * blockIdx.x;
int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
int in = inOffset + threadIdx.x;
int out = outOffset + (blockDim.x - 1 - threadIdx.x);
d_out[out] = d_in[in];
}
的「快」的代碼:
__global__ void reverseArrayBlock(int *d_out, int *d_in) {
extern __shared__ int s_data[];
int inOffset = blockDim.x * blockIdx.x;
int in = inOffset + threadIdx.x;
// Load one element per thread from device memory and store it
// *in reversed order* into temporary shared memory
s_data[blockDim.x - 1 - threadIdx.x] = d_in[in];
// Block until all threads in the block have written their data to shared mem
__syncthreads();
// write the data from shared memory in forward order,
// but to the reversed block offset as before
int outOffset = blockDim.x * (gridDim.x - 1 - blockIdx.x);
int out = outOffset + threadIdx.x;
d_out[out] = s_data[threadIdx.x];
}
你在使用什麼卡?它可以產生顯着的差異。 – 2012-08-13 18:13:08
由於顯着不同,較舊的卡僅支持在「正向順序」模式下有效讀取全局內存。較新的卡片不應該受此影響。 (我相信這在2.x發佈時有所變化) – 2012-08-13 19:32:16
該文章寫於2008年。硬件是費米前。我認爲這是'老'卡。 – Doug 2012-08-13 19:45:40