2012-08-02 81 views
0

有人可以启发我:在CUDA中并行/同时执行块吗? 换句话说,如果两个不同的块尝试写入相同的全局地址,即globalPtr [12],是否存在丢失更新问题?Cuda并行执行

(我要求这个作为我已阅读,在CUDA并行执行单元是warp = 32个线程。)

回答

2

是,多个块并行执行,所以访问全局存储器需要是原子的,如果多个线程需要访问相同的地址。无论是同一个块中的两个线程还是不同块中的两个线程,这都适用。

+0

谢谢保罗,虽然同一个块内的两个线程如果属于同一个warp就需要是原子的。如果没有,那么他们不会并行执行,到目前为止我的知识。 – thanasisanthopoulos 2012-08-03 09:15:34

2

是的,如果CUDA设备具有多个warp调度程序,则可以在多个块之间并行执行。

具有计算能力2.1的CUDA设备具有两个warp调度程序,因此可以同时执行来自两个不同warp(来自同一个块或不同块的指令)的指令。

具有计算能力3.0的CUDA设备具有四个warp调度程序,并且可以为每个warp执行准备执行的两条独立指令。

请注意,即使没有warp之间的并发执行,调度程序有多个块可用也是有利的,这样如果warp被阻塞等待内存操作完成,调度程序可以切换到另一warp执行,所以核心不会闲置。

可以驻留在核心上的调度程序可以切换到的核心数量因计算能力而异。

如果您只定义了与调度程序一样多的块,则无法实现设备的全部计算潜力。如果你的代码有很多内存I/O,尤其如此 - 一种“隐藏”内存延迟的方法是确保有足够的块/ warp可用,这样调度器总是有一个准备好的warp来切换到什么时候其中一个经纱空转,等待内存I/O。

无论您当前的硬件是否可以同时执行多个变形,只要您有多个变形读取和写入相同的内存地址,就应该使用原子I/O或锁定。即使在任务交换单核执行中,写后写后工件(“丢失更新”)也可以表现出来。

+0

这非常明确,谢谢。这让我去阅读相关的Cuda文档以获得更好的理解。我编码的内核使用嵌套循环来更新32 * 32共享内存。我明白,如果内核是32线程发出的,那么我可以保证在我的共享内存中没有竞争条件。不过,我发布256线程。有没有什么办法可以保证除了使用诸如if(threadIdx.x thanasisanthopoulos 2012-08-03 11:36:29

+0

那么,你可以把它拉回到每块只能运行32个线程,但是在更大的CUDA铁上,我怀疑这会造成比使用原子写入更多的性能问题。 – dthorpe 2012-08-03 19:27:14