关于共享数据处理的问题

我在用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位置累加,您必须使用原子操作以保证正确性。这是“不合适”与“合适”的关系,而非“合适”与“更合适”的关系。

大致这样,供您参考。

祝您好运!

好的明白了,谢谢

嗯嗯,不客气的,欢迎您常来论坛讨论问题~

祝您编码顺利!