我正在寫一個函數,需要迭代直到完成。我意識到我可以使用原子操作符,但速度在這個內核中很關鍵,我懷疑它們可能不是必需的。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中是原子的嗎?
總結:
結果是什麼,如果兩個線程相同的值寫入到一個布爾存儲位置?
可以從一個無符號的短內存位置讀取另一個線程正在向同一位置寫入一個新值返回一個既不是該內存位置上的值也不是新值的值?
這很棒。非常感謝你。清楚地向我展示瞭解決當前問題的途徑。 – Thormidable