我参加了CUDA并行编程课程,并且我看到了很多CUDA线程配置的例子,在这些例子中,我们需要将线程的数量四舍五入到最接近的32的倍数。我知道线程被分组为warp,如果你启动1000个线程,那么GPU会将它舍入到1024,所以为什么要明确地表达呢?为什么要在CUDA中启动32个线程的倍数?
2
A
回答
3
建议通常在您可能会想到选择各种线程块大小以解决相同问题的情况下给出。
让我们以矢量添加为例。假设我的矢量长度为100000.我可以选择通过启动100个1000线程块来实现。在这种情况下,每个块将有1000个活动线程和24个不活动线程。我的线程资源平均利用率为1000/1024 = 97.6%。
现在,如果我选择大小为1024的块呢?现在我只需要启动98块。这些块的前97个在线程利用率方面得到充分利用 - 每个线程都在做一些有用的事情。第98块只有672个(1024个)线程正在做一些有用的事情。由于线程检查(if (idx < N)
)或其他内核代码中的构造,其他显式非活动。所以我在这个块中有352个不活动的线程。但我的整体平均利用率十万〇三百五十二分之十万= 99.6%
因此,在上述情况下,最好选择“全” threadblocks,由32
整除如果你正在做载体上添加的矢量长度为1000,并且您打算在单个线程块中执行此操作(两者可能都是错误的想法),那么无论您为线程块大小选择1000还是1024,都无关紧要。
相关问题
- 1. 什么启动JVM线程?
- 2. 为什么在线程中执行此任务需要10倍的时间?
- 3. 为什么要从子shell /为什么parens在(someCommand&)中启动后台进程?
- 4. 为什么我需要块维度来计算CUDA中的线程ID?
- 5. 为什么启动一个线程被另一个线程阻塞?
- 6. 为什么数字会自动翻倍?
- 7. 为什么我不能在我的Activity中启动一个线程2x?
- 8. 启动多个线程,为什么你必须等待?
- 9. 为什么动态数组总是翻倍的2倍?
- 10. 这个过程为什么不启动?
- 11. CUPTI在多线程代码中阻止CUDA内核启动
- 12. 为什么共识数字在多线程中很重要?
- 13. 为什么两个Java线程(在某些情况下)比一个快两倍?
- 14. 为什么要了解CUDA Warps?
- 15. 当为一个int64变量时,为什么struct size是8的倍数在32位系统中
- 16. 为什么iOS需要启动图像?
- 17. 为什么printf输出在这个C程序中加倍了?
- 18. 为什么由ScheduledExecutorService.schedule()启动的线程永远不会终止?
- 19. 为什么我的线程不能立即启动?
- 20. 为什么我在CUDA程序中得到“未指定的启动失败”,将两个矩阵相乘
- 21. 为什么我需要EventQueue才能在java EDT中启动一个新线程? (JAVA)
- 22. JNI_CreateJavaVM()启动的线程数为
- 23. Python:为什么subprocess()在Ubuntu中启动2个进程,在OpenSUSE中启动1个进程?
- 24. 为什么需要Java线程?
- 25. Android onPause:为什么要停止线程?
- 26. 为什么GeckoFX Navigate()请求在单独的线程中启动时工作?
- 27. 为什么Media.SoundPlayer.Play()实际上在两次调用时启动两个新线程?
- 28. 在servlet中启动线程,有什么问题?
- 29. 为什么在进程启动期间创建了额外的工作线程?
- 30. 在servlet中启动一个新线程