在库中,我使用对几个CUDA内核的调用。我当然想得到最好的性能。用户使用该库的方式可能会有所不同。
块/线程的数量对此影响很大。
关于如何选择块/线程以获得最佳性能,有什么规则吗?
例如(只是一个问题),是不是最好选择块高,线程低?或者反过来呢?或者最好使用GetDeviceProperties()中的一些值?
发布于 2012-09-30 18:56:39
您可以使用NVIDIA提供的dependency calculator.xls来选择最佳配置,您必须尝试更改xls中线程和块的值以获得最佳配置,在此配置下,您可以获得最佳占用,这反过来会给您带来最佳性能。
发布于 2012-09-30 17:15:28
最好是在一个块中至少有一个完整的线程,否则只会使可用的处理能力得到很低的利用。此外,您通常希望有一个可由一个块中的线程数的翘曲大小均匀整除。
在一个块中使用的线程总数取决于您的资源使用情况。原则上,你想要的是一个大的占有率。这些限制由可用的共享内存和寄存器设置。如果您使用大量的共享内存和/或寄存器,则最大可达到的占用率会下降。然后,有必要分析和微调每个块的线程数量,直到找到一个最佳点,在这个点上,实现的占用率和理论占用率达到最大,当然,总占用率本身也尽可能接近100%。
根据经验,您希望最大化每个块的线程数量,同时保持良好的占用率。在分析步骤中,自动迭代一组可能的块/线程数组合以找到最极端的组合是完全有意义的。
发布于 2013-08-27 12:50:59
我觉得这完全是经验。
块和网格的大小取决于很多因素,如算法、每个线程的工作、资源、延迟。
在正常情况下,我将首先设置为256*256。并经常调整它以选择一个更好的。
在推力方面,他们将选择257这样的块大小,以避免银行冲突。
有很多资源可以帮助你选择。如:延迟和数据块大小(http://www.lsr.nectec.or.th/images/e/e6/Cuda_Optimization2.pdf)
无论如何,只要尝试并更新它即可。
https://stackoverflow.com/questions/12660060
复制相似问题