2014-03-03 120 views
1

我正在寫一個函數,需要迭代直到完成。我意識到我可以使用原子操作符,但速度在這個內核中很關鍵,我懷疑它們可能不是必需的。CUDA非原子寫衝突結果

我已經包括了一小片的僞代碼來證明什麼,我打算做

__global__ void TestKernel() 
{ 
    __shared__ bool lbRepeat[1]; 
    do 
    { 
    lbRepeat=false; 
    __syncthreads(); 
    if(Condition == true) lbRepeat=true; 
    __syncthreads(); 
    } 
    while(lbRepeat); 
} 

如果沒有線程已經發現條件是真實的lbRepeat將是錯誤的。

如果一個線程發現條件爲真,lbRepeat將爲true。

如果多個線程同時寫入lbRepeat,結果如何?

我想擴展到複製整數值(無符號16位具體)。以及檢查條件我想複製一個無符號的16位整數。

__global__ void TestKernel() 
{ 
    __shared__ unsigned short liValues[32*8]; 
    __shared__ bool lbRepeat[1]; 

    unsigned long tid = threadIdx.x+threadIdx.y*blockDim.x; 
    do 
    { 
    lbRepeat=false; 

    __syncthreads(); 
    if(Condition == true) 
    { 
     liValue[tid] = liValue[Some_Value_In_Range]; 
     lbRepeat=true; 
    } 
    __syncthreads(); 
    } 
    while(lbRepeat); 

} 

如果另一個線程寫入內存,因爲它可以讀取要返回這個事業沒有以前的值或新的價值?我不介意是否返回前一個值或新值(兩者都是有效的),但是每個位的混合會導致問題。

我以爲這是不可接受的,但我的測試似乎表明,它的工作原理如需。這是因爲未簽名的短複製在CUDA中是原子的嗎?

總結:

結果是什麼,如果兩個線程相同的值寫入到一個布爾存儲位置?

可以從一個無符號的短內存位置讀取另一個線程正在向同一位置寫入一個新值返回一個既不是該內存位置上的值也不是新值的值?

回答

3

如果兩個線程將相同的值寫入一個布爾型內存位置,結果如何?

最終結果將是其中一個寫入值將在該內存位置結束。哪個值是未定義的。如果所有書面價值都相同,您可以確定價值將最終在該位置。

可以從一個無符號短內存位置讀取另一個線程正在向同一位置寫入一個新值返回一個既不是該內存位置上的值也不是新值的值?

假設這些是唯一進行的兩個操作(一個寫,一個讀),否。讀取值將是寫入開始前的值或寫入完成後的值。如果你有多個寫道,那麼當然看到第一個問題的答案。實際的寫入值是未定義的,除了它將好像其中一個寫入成功並且所有其他寫入不成功。

我在上面的語句正確對齊8,16或32位數據類型,你的例子是。

+0

這很棒。非常感謝你。清楚地向我展示瞭解決當前問題的途徑。 – Thormidable