【发布时间】:2016-04-14 09:05:23
【问题描述】:
我正在关注a udacity problem set lesson,从一长串 numElems 值中计算出 numBins 元素的直方图。在这个简单的例子中,每个元素的值也是他自己在直方图中的 bin,因此使用 CPU 代码生成直方图就像
for (i = 0; i < numElems; ++i)
histo[val[i]]++;
我没有得到“快速直方图计算”的视频解释,据此我应该按“粗略 bin id”对值进行排序,然后计算最终的直方图。
问题是:
- 我为什么要按“粗分箱索引”对值进行排序?
【问题讨论】:
-
在这个特定问题中,您需要以这种方式对它们进行排序,因为您正在使用那些粗略的直方图数据桶执行计算,以将工作负载分配给线程。将数据从主内存传输到 GPU 内存是一项昂贵的操作,访问 GPU 内的共享内存也很昂贵。所以,为了最大化性能,你把所有的数据放在一起,所以当一个线程请求数据时,它会得到它需要的数据加上它将来需要的数据,而不是每次计算都必须访问共享内存。
-
谢谢 Nadir.. 所以我必须先对所有值进行排序?这不比读取并执行 atomicAdd 到正确的 bin 更昂贵吗?
-
我建议你两种方法都做,这样你就能看到区别。但我对 CUDA 的经验是,排列不当的内存比额外的计算负载更糟糕