为了解决多个线程在读写全局存储区数据或共享存储区数据的冲突问题,我把threadfence, volatile关键字都用了,但还是会有冲突,大家都是如何解决这个问题的呢?ps:threadfence是不是类似syncthreads的用法,而volatile直接加在全局变量前面就行了??
用原子指令吧!
之前看到一篇paper“M. Harris, S. Sengupta, and J. D. Owens, “Parallel prefix sum (scan) with CUDA,” in GPU Gems 3, H. Nguyen, Ed. Addison Wesley, 2007, ch. 39, pp. 851–876.”中有提到则么避免共享存储区数据的冲突。
大意是shared memory被分成16块。就是说第0个数据和第16个数据是分在同一个块里的,同时访问会产生冲突。如果你16个线程访问0~15个数据可以16个线程同时访问shared memory。这样数组建立的好也可以避免冲突。
原子函数?原子函数的参数要有地址,感觉在我的应用里不适合
我的应用里面不能这么分法,我是想用多个Agent随即分布到一个网格内,然后按照一定规则搜寻下一步的cell,所以不知道该怎么处理多个agent同时选择同一个cell的问题
方法没错,原子操作 fence volatile,
具体什么问题要看代码了
[
我用了fence和volatile,但依然存在冲突,还是有多个agent选择到一个cell中去
尽量使用原子操作,说实话fence和volatile中看不中用,个人意见,仅供参考!
能用原子操作的也用了,没效果……CUDA中没有加锁解锁机制吗
volatile和 fence是保证当前的线程对全局或者共享内存的修改对其他线程是安全的。即其他线程调用该线程修改的内存是里面的值是最新修改的。读写冲突可以用原子操作使之序列化。
得看具体的冲突原因
1、用原子操作
2、block内线程同步
3、block之间线程同步,重新开kernel