c++ CUDA:来自不同线程束但相同块的2个线程尝试写入相同的SHARED内存位置:危险?

6mw9ycah  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(117)

这会导致共享内存中的不一致吗?
我的内核代码看起来像这样(伪代码):

__shared__ uint histogram[32][64];

uint threadLane = threadIdx.x % 32;

for (data){
     histogram[threadLane][data]++;
}

如果在一个有64个线程的块中,id为x(x + 32)的线程经常写入矩阵中的同一位置,那么这会导致冲突吗?
此程序计算给定矩阵的直方图。我有一个类似的CPU程序,它做同样的事情。GPU计算的直方图始终比CPU计算的直方图低1/128,我不知道为什么。

hmae6n7t

hmae6n7t1#

这很危险这导致了竞争条件。
如果你不能保证一个块中的每个线程对共享内存中的某个位置都有唯一的写访问权限,那么你就有问题了,因为你需要通过同步来解决这个问题。
看看这篇文章,了解如何正确有效地使用SM进行直方图计算:http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/histogram64/doc/histogram.pdf
请注意,有很多在线库允许您在一行Thrust for instance中计算直方图。

相关问题