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