gpt4 book ai didi

c++ - 当运行的线程多于内核时,CUDA 性能会提高

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:01 25 4
gpt4 key购买 nike

为什么每个 block 运行超过 32 个线程时性能会提高?

我的显卡有 480 个 CUDA 内核 (15 MS * 32 SP)。

最佳答案

每个 SM 有 1-4 个 warp 调度器(Tesla = 1,Fermi = 2,Kepler = 4)。每个 warp 调度程序负责执行分配给 SM 的 warp 的子集。每个 warp 调度程序维护一个符合条件的 warp 列表。如果 warp 可以在下一个周期发出指令,则它是合格的。如果 warp 在数据依赖性上停止,等待获取和指令,或者下一条指令的执行单元正忙,则 warp 不合格。在每个周期中,每个 warp 调度程序将从符合条件的 warp 列表中选择一个 warp,并发出 1 或 2 条指令。

每个 SM 的活跃 warp 越多,每个 warp 调度程序必须在每个周期中选择的 warp 数量就越大。在大多数情况下,当每个 SM 有足够的事件 warp,每个周期每个 warp 调度程序有 1 个合格的 warp 时,可以实现最佳性能。超出此点增加入住率不会提高性能,而且可能会降低性能。

事件扭曲的典型目标是 SM 最大扭曲的 50-66%。发射配置支持的扭曲与最大扭曲的比率称为理论占用率。每个周期的事件 warp 与每个周期的最大 warp 的运行时间比率是 Achieved Occupancy。对于 GTX480(CC 2.0 设备),设计内核时一个好的起点是 50-66% 的理论占用率。 CC 2.0 SM 最多可以有 48 个扭曲。 50% 的占用率意味着每个 SM 有 24 个 warp 或 768 个线程。

Nsight Visual Studio 版本中的 CUDA 分析事件可以显示理论占用率、实现的占用率、每个 SM 的事件 warp、每个 SM 的合格 warp 以及停滞原因。

CUDA 可视化分析器、nvprof 和命令行分析器可以显示理论占用率、事件扭曲和实现的占用率。

注意:CUDA 内核的数量应该只用于比较类似架构的卡,计算理论 FLOPS,并可能比较架构之间的差异。设计算法时不要使用计数。

关于c++ - 当运行的线程多于内核时,CUDA 性能会提高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13765374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com