2014-09-22 76 views
-1

我是CUDA編程新手,並且有一個奇怪的行爲。其他線程會在CUDA中的代碼中阻塞嗎?

我有一個這樣的內核:

__global__ void myKernel (uint64_t *input, int numOfBlocks, uint64_t *state) { 

    int const t = blockIdx.x * blockDim.x + threadIdx.x; 
    int i; 
    for (i = 0; i < numOfBlocks; i++) { 
    if (t < 32) { 
     if (t < 8) { 
     state[t] = state[t]^input[t]; 
     } 
     if (t < 25) { 
     deviceFunc(device_state); /* will use some printf() */ 
     } 
    } 
    } 
} 

我運行這個內核與此參數: MYKERNEL < < < 1,32 >>>(輸入,numOfBlocks,狀態);

如果'numOfBlocks'等於1,它將正常工作,我得到我期待的結果,並且deviceFunc()內的printf()按正確的順序排列。

如果'numOfBlocks'等於2,它不能正常工作!結果並不是我所期望的和printf()的順序不正確(我只使用線程0中的printf())!所以,我的問題是現在:(32-25),不調用deviceFunc()的左線程,他們將等待和阻止,這個位置或他們將再次運行,並重新開始與下一個for-循環迭代?我一直認爲內核中的每一行都在同一個塊中同步。

+0

我有我的代碼的序列版本,其結果只有一個'numOfBlocks'的輸入M相同的結果。如果我用2'numOfBlocks'使用另一個輸入M',結果與我的串行代碼不同。 – Burak 2014-09-22 12:00:37

+3

您能否提供一個最小尺寸,完整的問題重現器?沒有它,就不可能回答你的問題。 – JackOLantern 2014-09-22 16:11:01

回答

1

我在這一整天工作,我終於找到了解決方案。首先,你是對的,我在我的deviceFunc()中有許多RAW危害。我在任何WRITE操作後開始放置一些__syncthreads(),但我認爲這會減慢我的程序。我不認爲__syncthreads()是解決它們的常用方法。有趣的是,結果仍然是和沒有__syncthreads()一樣的。

但上面我在我的代碼的問題是,我用

input[t] 

這是錯誤的,因爲我必須包括在我的指數計算「numOfBlocks」:

input[(NUM_OF_XOR_THREADS * i) + t) 

現在,結果是正確的,我的問題解決了。