这是否会导致共享内存不一致?
我的内核代码看起来像这样(伪代码):
__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,我无法弄清楚原因。
答案 0 :(得分:1)
这很危险。它会导致竞争条件。
如果您无法保证块中的每个线程对共享内存中的某个位置具有唯一的写访问权限,那么您就会遇到问题,因为您需要通过同步来解决。
查看本文,了解使用SM进行直方图计算的正确有效方法:http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/projects/histogram64/doc/histogram.pdf
请注意,网上有大量图书馆,您可以在一行中Thrust
for instance计算直方图。