【发布时间】:2012-09-30 09:06:50
【问题描述】:
在一个库中,我使用对多个 CUDA 内核的调用。我当然想得到最好的表现。用户使用库的方式可能会有所不同。
块/线程的数量对此有很大影响。
对于如何选择块/线程以获得最佳性能是否有一些规则?
例如(只是一个问题),最好选择块高,线程低?还是反过来? 还是最好使用 GetDeviceProperties() 中的一些值?
【问题讨论】:
标签: cuda
在一个库中,我使用对多个 CUDA 内核的调用。我当然想得到最好的表现。用户使用库的方式可能会有所不同。
块/线程的数量对此有很大影响。
对于如何选择块/线程以获得最佳性能是否有一些规则?
例如(只是一个问题),最好选择块高,线程低?还是反过来? 还是最好使用 GetDeviceProperties() 中的一些值?
【问题讨论】:
标签: cuda
您可以使用 NVIDIA 提供的依赖项calculator.xls 来选择[您必须尝试更改 xls 中线程和块的值] 最佳配置,在此配置上您可以获得最佳占用率,进而为您提供最佳配置表现。
【讨论】:
最好你希望在一个块中至少有一个完整的线程,否则你只会对可用的处理能力进行不良使用。此外,您通常希望一个块中的线程数能被 warp 大小整除。
一个块中使用的线程总数取决于您的资源使用情况。原则上,您希望以大入住率为目标。这些限制由可用的共享内存和寄存器设置。如果您使用大量共享内存和/或寄存器,则可实现的最大占用率下降。然后,对每个块的线程数进行分析和微调是有意义的,直到找到一个最佳点,实现的占用率和理论占用率最大化,当然总占用率本身也尽可能接近 100%。
根据经验,您希望在保持良好占用率的同时最大化每个块的线程数。在分析步骤中自动迭代一组可能的块/线程数组合以找到极值组合是完全有意义的。
【讨论】:
我认为这完全是经验。
块和网格大小取决于很多因素,例如算法、每个线程的工作量、资源、延迟。
在正常情况下,我会先制作为 256*256。并经常调整以选择更好的。
为了避免银行冲突,他们会选择像 257 这样的块大小。
有很多资源可以帮助您选择。 喜欢: 延迟和块大小 (http://www.lsr.nectec.or.th/images/e/e6/Cuda_Optimization2.pdf)
无论如何,只要尝试更新它。
【讨论】: