运行更多线程时,CUDA性能会提高

use*_*750 5 c++ cuda opencl

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

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

Gre*_*ith 7

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

每个SM的更活跃的warp,每个warp调度程序在每个循环中必须选择的warp数越大.在大多数情况下,当每个SM有足够的活动warp时,每个周期每个warp调度程序有一个符合条件的warp,就可以实现最佳性能.超出此点的占用率增加不会提高性能并可能降低性能.

活动经线的典型目标是SM的最大经线的50-66%.由发射配置支持的经线与最大经线的比率称为理论占用率.每个循环的活动扭曲与每个循环的最大扭曲的运行时间比率是达到占用率.对于GTX480(CC 2.0设备),设计内核的良好起点是理论占用率为50-66%.CC 2.0 SM最多可以有48个经线.50%的占用率意味着每个SM有24个经线或768个线程.

Nsight Visual Studio Edition中的CUDA性能分析活动可以显示理论占用率,实现占用率,每SM的活动warp,每SM的符合条件的warp和停顿原因.

CUDA Visual Profiler,nvprof和命令行分析器可以显示理论占用率,活动warp和实现占用率.

注意:CUDA核心数应仅用于比较类似架构的卡,以计算理论FLOPS,并可能比较架构之间的差异.在设计算法时不要使用计数.

  • 谢谢你,格雷格.非常有用的信息.为什么50-66%是一个好目标? (2认同)

Rog*_*ahl 5

欢迎来到Stack Overflow.原因是CUDA核心是流水线的.在费米,管道长约20个时钟.这意味着要使GPU饱和,每个核心最多可能需要20个线程.

  • 除此之外,在SM单元上拥有的线程数多于运行中的核心数允许GPU隐藏内存访问延迟.如果您拥有与核心一样多的线程运行,那么当线程访问全局内存时,它必须等待几百个时钟周期才能实际接收数据.与此同时,如果没有额外的线程,那么该SM单元将处于空闲状态.如果有额外的线程,SM单元将暂停等待内存访问的线程,并切换到另一组线程,还有更多工作要做.这有效地隐藏了访问全局内存的费用. (5认同)