CUDA C编程指南 第五章 在多处理器级别使使用率最大化

  • 多处理器级别

隐藏L个时钟周期延迟所​​需的指令数取决于这些指令的相应吞吐量(有关各种算术指令的吞吐量,请参见第5.4.1节);假设所有指令的最大吞吐量,它是:

  1. 1.x计算能力的设备, 一个多处理器一个warp在4个时钟周期内发射一条指令到一个warp需要L/4 个延迟周期。
  2. 2.0计算能力的设备, 一个多处理器一个warp在2个时钟周期内发射一条指令到两个warp需要L 个延迟周期。
  3. 2.1计算能力的设备, 一个多处理器一个warp在2个时钟周期内发射两条指令到一个warp需要2L 个延迟周期
  4. 3.0计算能力的设备, 一个多处理器一个warp在1个时钟周期内发射两条指令到4个warp需要2L 个延迟周期

在计算能力2.0的设备上,每个时钟周期发送两条指令给不同的warps。在计算能力2.1的设备上,每个时钟周期发送四个指令给分为两组发给两个不同的warp,一组指令发给相同的warp。

在计算能力3.0的设备上,每个时钟周期将发送8个指令分为四组发送给四个不同的warp,一组发送给相同的warp。

一个warp没有准备好去执行他的下一个指令的原因是这条指令的输入操作数还不可用。

如果所有的输入操作数是寄存器,寄存器依赖将导致延迟。执行时间取决于指令,但对于计算能力1.x和2.x的设备通常约为22个时钟周期,对于计算能力3.0的设备通常约为11个时钟周期,对于计算能力1.x的设备,需要转换为6个warp,对于计算能力2.x和更高的设备(仍然假设warp执行具有最大吞吐量的指令,否则需要更少的warp),需要转换为22 warp。假设足够的指令级并行性,对于计算能力为2.1或更高的设备,以便调度程序始终能够为每个warp发出指令对。

warp没准备好执行下一条指令的另一个原因是他正在等待内存fence(栅栏)或者同步点。同步点可以让多处理器使越来越多的warp空闲,以等待在同一个线程块中的其他的warp执行到同步点。一个多处理器有很多的线程块可以帮助减少这个空闲的状态,因为不同线程块中的warp之间不需要再同步点处互相等待。

对于给定内核调用,每个多处理器上的线程块和warp的数量都是根据执行配置来分配的(B1.8),多处理器的内存资源以及核函数所要求的资源在(4.2节(第四章硬件多线程))描述。为了帮助程序员根据寄存器和共享内存要求选择线程块大小,CUDA Software DevelopmentKit提供了一个名为CUDA占用计算器的电子表格,其中占用率定义为驻留warp数与驻留warp最大数之比(在附录F中给出了各种计算能力)。

B1.8  寄存器数量与线程块
  1. 初始寄存器使用率高于L
    编译器会将其进一步减小,直到它变得小于或等于L,通常以更多本地存储器使用和/或更多指令数为代价;
  2. 初始寄存器使用率低于L
    ➢如果指定了maxThreadsPerBlock且minBlocksPerMultiprocessor未指定,则编译器使用maxThreadsPerBlock来确定n和n + 1驻留块之间的转换的寄存器使用阈值(即,当使用少一个寄存器为另外的驻留块腾出空间时,如示例中的第5.2.3节)然后应用类似的启发式,当没有指定启动边界时;
    ➢如果同时指定了minBlocksPerMultiprocessor和maxThreadsPerBlock,编译器可能会将寄存器使用率提高到L,以减少指令数量并更好地隐藏单线程指令延迟。
    如果每个块执行的线程多于其启动绑定maxThreadsPerBlock,则内核将无法启动。
    对于给定内核的最佳启动边界通常会在主要体系结构修订版中有所不同。下面的示例代码显示了如何使用第3.1.4节中介绍的__CUDA_ARCH__宏在设备代码中处理这种情况。

编译器在使用–ptxas-options = -v选项进行编译时会报告寄存器,本地,共享和常量内存使用情况。

线程块所需的共享内存总量等于静态分配的共享内存量和动态分配的和。对于1.x设备,这个核函数的大多数共享内存的使用参数参加(B1.4节)。

内核使用的寄存器数量会对驻留warp的数量产生重大影响。例如,对于计算能力为1.2的设备,如果内核使用16个寄存器并且每个块具有512个线程并且需要非常少的共享存储器,那么两个块(即32个warp)可以驻留在多处理器上,因为它们需要2x512x16寄存器,匹配多处理器上可用的寄存器数量。但是一旦内核再使用一个寄存器,就只能驻留一个块(即16个warp),因为两个块需要2x512x17个寄存器,这些寄存器比多处理器上可用的寄存器多。因此,编译器尝试最小化寄存器使用,同时保持寄存器溢出(参见第5.3.2.2节)和指令数量至少。
可以使用-maxrregcount编译器选项或启动边界来控制寄存器使用,如第B.19节中所述。

每个双变量(在支持本机双精度的设备上,即计算能力为1.2或更高的设备)和每个长long变量使用两个寄存器。 但是,计算能力为1.2或更高的设备每个多处理器的寄存器数至少是计算能力较低的设备的两倍。
执行配置对给定内核调用的性能的影响通常取决于内核代码。 因此建议进行实验。 应用程序还可以根据寄存器文件大小和共享内存大小来参数化执行配置,这取决于设备的计算能力,以及设备的多处理器数量和内存带宽,所有这些都可以使用运行时查询 (参见参考手册)。
每个块的线程数应该选择为warp大小的倍数,以避免尽可能多地浪费计算资源与经验不足的warp。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值