我正在 CUDA 上实现一个复杂的算法。但是有一个非常奇怪的问题。问题可以概括为:内核会多次重复一系列计算。本次迭代的计算是基于前一次的结果。我在全局内存上使用一个数组来在每次迭代中的块之间传递信息。例如有 2 个块,对于每个迭代块 0 将结果保存到全局内存中,然后块 1 从全局内存中读取它。但是问题是块 1 无法从全局内存中读取数组。它有时会返回第一次迭代的结果,而不是前一次。
a_e 和 e_a 是全局 mem 上的两个数组,大小为 [2*8]。d_a_e 和 d_e_a 在共享内存上,大小为 [blockDim.x+1][8]。
if(threadIdx.x<8)
{
//block 0 writes, block 1 reads, this can't work properly
a_e[blockIdx.x*8+threadIdx.x]=d_a_e[blockDim.x][threadIdx.x];
if(blockIdx.x>0)
d_a_e[0][threadIdx.x]=a_e[(blockIdx.x-1)*8+threadIdx.x];
//block 1 writes, block 0 reads, this can work properly
e_a[blockIdx.x*8+threadIdx.x]=d_e_a[0][threadIdx.x];
if(blockIdx.x < gridDim.x-1)
d_e_a[blockDim.x][threadIdx.x]=e_a[(blockIdx.x+1)*8+threadIdx.x];
}