程序由于每个线程产生的结果数目不确定,因此在global memory中定义了一个全局结构数组、一个全局index作为数组下标。每次一个线程产生结果写入到全局数组中,并累加下标。在CUDA中如何使多线程写串行呢?
LZ您好,一般而言在CUDA的并行多线程中要维护串行操作的话,可以使用原子操作。
您这里可以通过原子操作累加以得到安全的写入范围,然后线程各自写入即可。以及如果每个线程都使用原子操作导致速度过慢的话,您也可以尝试一个warp或者一个block先内部组合自己的结果,然后每个warp或者block使用一次原子操作确定写入范围并写入。以及如果一个block整体统计和写入的话,可以先将临时结果保存在shared memory中,最后多个线程协同写入,可以避免各个线程各自为战写入的时候,有的忙死,有的闲死。
最后需要说明的是,原子操作能保证多线程间的串行操作,但是无法保证谁先谁后的顺序性。
大致如此,供您参考,祝您编码顺利~
明白该怎样写了,谢谢ice版主!
LZ您好,不客气的,上述内容只是基本的实现思路而已,欢迎您在实现中积极尝试进一步优化并反馈论坛。
祝您编码顺利~