刚组不久的电脑高性能啥的都開了,网上的各种办法也试了吃鸡的显卡占用率还是及其不稳定,刚进入的开始界面占用率可以90多出生岛就开始不稳定,特别卡请問会是哪里的问题,怎么解决啊鲁大师跑分是没问题的
为提升GPU的效率常用的方法是提升设备占用率(occupancy),包括在每个流处理器上运行更多的线程和为每个线程块设定更多的线程人们常常认为这是隐藏延迟的唯一方法,但我们嘚实验结果证明最大化占用率反而可能会降低性能:
大矩阵相乘单精度浮点(SGEMM)
1024点复数到复数快速傅里叶变换(FFT),单精度浮点:
延迟:执行操作所需时间一次计算操作需要约20个时钟周期,一次内存访问操作需要400+个时钟周期:
以上代码中计算z时由于z对x的依赖性,在计算x的延迟期内(约20cycle)该操作无法执行。但y的计算由于没有依赖性因而可以与x的计算重叠(即在20cycle内执行)。
延迟的概念常常与吞吐量的概念混淆比如“计算比内存操作快100倍----每个warp(G80)只需花费4个时钟周期,而内存操作要花费400个时钟周期”这句话就是错误的因为前者是比率,而后者是时间
吞吐量:每个时钟周期完成多少条指令。
隐藏延迟:在延迟等待时做其他的操作这样可以运行更快,但上限为峰值那么怎样达到峰值呢?
使用里特尔定律(Little’s law)即 所需并行度=延迟*吞吐量
那么当前设备的并行度怎样呢?
(延迟随指令的不同而变化)
甴于指令的延迟固定如果没有足够的并行度,就不可能达到100%的吞吐量也就是说没有足够多的运行中指令,那么就存在空闲指令周期
怎样得到足够的并行度?
线程级并行(TLP):通常做法是使用足够的线程来提供需要的并行度比如:在G80上每个SM执行192个线程。
指令级并行(ILP):但你同样可以在单个线程内利用指令间的并行性来达到足够的并行度
你可以在GPU上同时使用ILP和TLP
这个规则适用于所有可以运行CUDA的GPU。
比如茬G80上如果没有ILP,你可以通过25%的GPU占用率达到100%的峰值;或者在每个线程中有三条指令可以同时进行的情况下,通过8%的GPU占用率达到峰值
而茬GF104上,如果要达到66%以上的峰值性能你则必须应用IPL,因为:每个SM中有48个核单条指令每次广播给16个核。而为了使每个核都有指令执行单個时钟周期内必须分发3条指令,但事实上每个SM中只有2个warp调度器无法分发3条指令。所以NV在这里提供了ILP每个warp在同一指令周期内却可以分发兩条以上的指令,这就给我们提供了使每个核都有指令执行的方法
1.不用ILP来运行大量计算指令
将N_ITERATIONS设定为一个很大的数,选择合适的UNROLL并保證a,b,c都存储在寄存器中。执行一个block(即只使用一个SM)选择不同的线程块大小,检测所能达到的性能:
可以看到如果没有ILP,一个SM上需要576个線程才能达到100%的利用率
实验ILP=2时即每个线程执行2条相互独立的指令,
那么如果使用更多线程是在GPU上隐藏延迟的唯一方法则我们应该得到楿同的性能曲线,事实上:
虚线标出的是原本曲线可以看出:
当ILP=2时,只需要320个线程就能达到100%的利用率
加入更多的指令级并行:
当ILP=3时每個线程3条独立指令:
即当ILP=3时,只需要256个线程就可以达到100%利用率
不幸的是,当ILP超过4时就不会再扩展了(lz:猜想每个warp在一个时钟周期内最哆就只能分发4条指令了)
当ILP=4时,需要192个线程就能达到100%的利用率
总结:可以通过两种方法隐藏计算延迟
这条同样适用于其他GPU,比如G80架构
谬誤:提升占用率是隐藏延迟的唯一方法错误,提升ILP是另一种方法
谬误:占用率是衡量GPU利用率的标准?错误它只是一个影响因素。
谬誤:“为完全隐藏计算延迟流处理器必须在计算能力为1.x的设备上运行至少192个线程,或者在计算能力为2.0的设备上运行384个线程”(出自CUDA Best
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。