我是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-循環迭代?我一直認爲內核中的每一行都在同一個塊中同步。
我有我的代碼的序列版本,其結果只有一個'numOfBlocks'的輸入M相同的結果。如果我用2'numOfBlocks'使用另一個輸入M',結果與我的串行代碼不同。 – Burak 2014-09-22 12:00:37
您能否提供一個最小尺寸,完整的問題重現器?沒有它,就不可能回答你的問題。 – JackOLantern 2014-09-22 16:11:01