2014-09-22 78 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) 

现在,结果是正确的,我的问题解决了。