如何在CUDA中测量流式多处理器的使用/空闲时间?

时间:2012-08-20 18:20:03

标签: cuda profiling multiprocessor

一个简单的问题,确实:我有一个内核,它可以运行每个Streaming Multiprocessor(SM)的最大块数,并且想知道理论上可以从中提取多少性能。理想情况下,我想知道空闲的SM周期的百分比,即所有warp在内存访问时被阻止。

我真的只是想找到这个号码。我寻找的是

  • 增加入住率的一般提示。我正在使用我可以获得的所有占用,即使我设法获得更多性能,它也不会告诉我理论上可能有多少。
  • 如何计算GFlops的理论峰值。我的计算不是以FP为中心的,还有很多整数运算和逻辑。

1 个答案:

答案 0 :(得分:5)

Nsight Visual Studio Edition 2.1和2.2问题效率实验提供您要求的信息。应在CUDA 5.0之后的版本中将这些计数器/指标添加到Visual Profiler中。

Nsight Visual Studio Edition

来自Nsight Visual Studio Edition 2.2 User Guide | Analysis Tools | Other Analysis Reports | Profiler CUDA Settings | Issue Efficiency Section

  

问题效率提供有关设备能力的信息   发出内核的指令。报告的数据包括   执行依赖项,符合条件的warp和SM停顿原因。

     

对于计算能力2.x的设备,多处理器有两个warp   调度。每个warp调度程序最多可管理24个warp   每个多处理器48个warp。内核执行配置可以   减少运行时限制。有关入住率的信息,请参阅   实现了入住实验。第一个调度程序负责   使用奇数ID进行warp,第二个调度程序负责warp   带有偶数ID。

KEPLER UPDATE:对于计算能力3.x,多处理器有四个warp调度程序。每个warp调度程序最多可管理16个warp,每个多处理器总共64个warp。

  

在每个指令发布时,每个调度程序都会选择一个符合条件的   从其活动warp列表中扭曲并发出指令。经线是   如果已经获取了指令,则执行单元   指令要求可用,指令没有   尚未满足的依赖关系。

     

调度程序报告以下有关warp的统计信息   多处理器:

     

活动变形 - 变换从a计划开始时处于活动状态   多处理器,直到它完成最后一条指令。活跃的   每周期扭转计数器增量0-48。每个最大增量   周期由理论占用率定义。

KEPLER UPDATE范围是每周期0-64。

  

符合条件的Warp - 如果能够发出下一条指令,则有效的warp符合条件。   不符合条件的Warp将报告问题停止原因。这个   计数器将每周期增加0-ActiveWarps。

UPDATE在Fermi上,问题停止原因计数器仅在warp调度程序没有符合条件的warp周期更新。在Kepler上,即使warp调度程序发出指令,问题停止原因计数器也会在每个周期更新。

  

零符合条件的扭曲 - 如果是,此计数器会将每个循环增加1   调度程序都没有   可以发行的经线。

     

一个合格的变形 - 此计数器递增   如果两个调度程序中只有一个具有可以的warp,则每个循环1   发行。

KEPLER UPDATE:在Kepler上,计数器是每个调度程序,因此一个符合条件的Warp意味着warp调度程序可以发出指令。在Fermi上,两个调度程序都有一个计数器,所以在Fermi上你想要一个合格的Warp计数器尽可能小。

  

扭曲问题孔 - 此计数器将每个循环增加   不符合条件的活动warp的数量。这是一样的   主动变形减去合格变形。

     

长翘曲问题 - 这个   计数器将每个循环增加有活动扭曲的数量   没有资格发出超过32个时钟的指令   周期。长孔表示经线在长延迟时停滞不前   障碍和记忆操作等原因。

     

发布失速原因 -   每个循环,每个不合格的扭曲将增加一个问题失速   理由柜台。所有发行失败原因计数器的总和是相等的   破坏问题漏洞。不合格的扭曲会增加指令提取   如果还没有下一个汇编指令,则停止原因   牵强。如果输入依赖性是执行依赖停止原因   尚不可用。这可以通过增加数量来减少   独立指示。 数据请求如果请求停止原因   目前无法制作,因为所需的资源不可用,   或者是完全利用的,或者已经有太多这种类型的操作   优秀。如果数据请求构成了很大一部分   失速的原因,你还应该运行内存实验来确定   如果您可以根据请求或需要优化现有交易   重新审视你的算法。如果纹理纹理停止原因   子系统已经充分利用,目前无法接受   进一步的行动如果warp是同步停止原因   在__syncthreads()处被阻止。如果这个原因很大而且是内核   执行配置仅限于少量块   考虑将内核网格划分为更多的线程块。

Visual Profiler 5.0

Visual Profiler没有可以解决您问题的计数器。在添加计数器之前,您可以使用以下计数器:

  • sm_efficiency [_instance]
  • IPC [_instance]
  • achieved_occupancy。

计算能力的目标和最大IPC是:

Compute     Target   Max
Capability  IPC      IPC
2.0         1.7      2.0
2.x         2.3      4.0
3.x         4.4      7.0

目标IPC用于ALU限制计算。内存绑定内核的目标IPC将更少。对于计算能力2.1设备和更高的设备,使用IPC更难,因为每个warp调度程序都可以双重发布。