2013-01-23 51 views
0

我在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]; 
} 
+4

Cuda不保證第一個塊在第二個塊之前運行,即使他們這樣做也不能保證全局內存一致性。 – talonmies

回答

1

此設置不起作用;你有效地試圖序列化你的評論中提到的矮人的塊,是行不通的。從CUDA編程指南:

「需要獨立執行的線程塊:必須能夠以任意順序,並行或串行方式執行它們。這種獨立性要求允許線程塊以任意順序核心數量......」 http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy

你最好的追索權,如果可能推出單獨的內核(如您執行的第一個內核中的塊0計算,1塊在第二個內核等),以試圖強制執行第一個內核的結果在下一個內核中讀取之前完成。在塊間同步方面已經完成了一些工作,但是您不需要從中獲得太多好處,因爲您需要序列化塊。

編輯:我還應該指出,塊調度沒有記錄,並可能在任何時候改變,所以任何塊間同步將是不可移植的,並有可能在驅動程序或CUDA工具包中斷更新。