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