我是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