CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?
CUDA: 2 threads from different warps but same block attempt to write into same SHARED memory position: dangerous?
这会导致共享内存不一致吗?
我的内核代码如下所示(伪代码(:
__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
。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 既然存在危险,为什么项目要使用-I include开关
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 未初始化的变量有什么危险
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- 从python调用openMP共享库时,未定义opnMP函数
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 为什么我的共享库中存在展开符号
- 使用共享指针的函数调用,其对象应为 const
- 具有两个独占锁组的共享锁
- 共享队列的线程安全
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- CUDA:来自不同翘曲但相同块的 2 个线程尝试写入相同的共享内存位置:危险?