CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?

CUDA: 2 threads from different warps but same block attempt to write into same SHARED memory position: dangerous?

本文关键字:共享 危险 位置 内存 线程 CUDA      更新时间:2023-10-16

这会导致共享内存不一致吗?

我的内核代码如下所示(伪代码(:

__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,我不知道为什么。

这很危险。它会导致竞争条件。

如果不能保证块中的每个线程对共享内存中的某个位置具有唯一的写入访问权限,那么您就有问题了,因为您需要通过同步来解决。

看看这篇论文,了解使用 SM 进行直方图计算的正确有效方法:http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/histogram64/doc/histogram.pdf

请注意,网上有很多库允许您在一行中计算直方图,例如Thrust