2013-11-14 46 views
1

我正在实现的算法有许多事情需要并行完成。我的问题是,如果我不打算使用共享内存,我应该更喜欢使用更少的线程/块或更多的线程/块来减少性能的块,以便总线程数加起来就是我需要的并行数量去做?Cuda块或线程首选项

+0

[CUDA确定每个块的线程,每个网格的块的可能重复](http://stackoverflow.com/questions/4391162/cuda-determining-threads-per-block-blocks-per-grid),[CUDA,如何选择<<<块,线程<>>?](http://stackoverflow.com/questions/12660060/cuda-how-to-choose-blocks-threads),也许[CUDA - 如果我选择了太多块?](http://stackoverflow.com/questions/5476152/cuda-what-if-i-choose-too-many-blocks)。 – JackOLantern

回答

1

我假设“设定数量的东西”是一个小数字,或者你不会问这个问题。试图揭示更多的并行性可能花费时间。

CUDA GPUs组执行活动和结果内存访问到32个线程的warps。所以至少要创建每个线程块至少一个warp。

然后,您会希望至少创建与GPU中SM一样多的线程块。如果你有4个SM,那么你在32以上的下一个缩放增量就是创建4个线程块,每个线程块有32个线程。

如果在这个假设的例子中你有超过128个“数目的东西”,那么你可能会想要增加每个线程块和线程块的扭曲。你可能会从threadblocks开始,直到你得到一些数字,大约16个左右,这将允许你的代码在比你假设的4-SM GPU更大的GPU上扩展。但是可以在单个SM上打开的线程块数量是有限制的,因此在16个线程块之后很快就会增加每个线程块超过1的线程数量(即超过32个线程)。

这些针对小问题的策略将允许您在问题扩大时尽可能快地利用GPU上的所有硬件,同时如果问题足够大,仍然允许隐藏延迟时间的机会(例如,超过每个线程块有一个warp,或者每个SM有多个threadblock)。