我在用GPU做直方图统计,用到了shared memory来先统计每一个一个block内的小直方图,后再把他们合并成大的直方图。
在做每个bloak的小直方图时__shared__ int s_hist[256];s_hist[int(Idata[pos]*255)]++这么写行不行;能不能表达成每个thread计算后将数组值加1
LZ您好:
1:您没有给出详细的行为叙述,所以我无法给您直接答复。
2:如果您的算法中会有不同的线程向同一shared memory位置进行累加,请使用原子操作。
3:以及,如果密集使用原子操作无法满足您的性能要求,请考虑修改您的算法实现或者考虑使用更新版本的GPU硬件,据说kepler的原子操作性能有了不小的提升。
大致如此,请您考虑一下。
祝您编码顺利~~
是的,我做的就是每个thread计算的数据向一个shared类型数组累加,是用原子操作更合适吗
是的,我做的就是每个thread计算的数据向一个shared类型数组累加,是用原子操作更合适吗
LZ您好:
1:如果您的算法能保证所有的 线程都只朝向各自的不重复的shared memory位置累加,那么是可以直接用的。
2:以及,如果不能,也就是说是有多个threads向同一个shared memory位置累加,您必须使用原子操作以保证正确性。这是“不合适”与“合适”的关系,而非“合适”与“更合适”的关系。
大致这样,供您参考。
祝您好运!
好的明白了,谢谢
嗯嗯,不客气的,欢迎您常来论坛讨论问题~
祝您编码顺利!