我在CUDA上實現了一個複雜的算法。但是有一個非常奇怪的問題。這個問題可以概括如下:內核會多次重複一系列的計算。目前迭代的計算取決於前一個的結果。我在全局內存上使用數組來在每次迭代中在塊之間傳遞信息。例如,有2個塊,對於每個迭代,塊0將結果保存到全局內存中,然後塊1從全局內存中讀取它。但問題是塊1不能從全局內存讀取數組。它有時會返回第一次迭代的結果,而不是前一次。未能從全局內存中讀取數組CUDA
a_e和e_a是全局mem上的兩個數組,大小爲[2 * 8]。 d_a_e和d_e_a位於共享內存上,大小爲[blockDim.x + 1] [8]。
if(threadIdx.x<8)
{
//block 0 writes, block 1 reads, this can't work properly
a_e[blockIdx.x*8+threadIdx.x]=d_a_e[blockDim.x][threadIdx.x];
if(blockIdx.x>0)
d_a_e[0][threadIdx.x]=a_e[(blockIdx.x-1)*8+threadIdx.x];
//block 1 writes, block 0 reads, this can work properly
e_a[blockIdx.x*8+threadIdx.x]=d_e_a[0][threadIdx.x];
if(blockIdx.x < gridDim.x-1)
d_e_a[blockDim.x][threadIdx.x]=e_a[(blockIdx.x+1)*8+threadIdx.x];
}
Cuda不保證第一個塊在第二個塊之前運行,即使他們這樣做也不能保證全局內存一致性。 – talonmies