GPU通过大量线程的计算来掩盖global memory延迟,那到底需要多少计算量才能掩盖global memory的延迟呢?
假设针对capability 3.5的卡,每个SMX执行1024个线程,global memory的延迟为500 cycles,所有读取的global memory都没有被cache,所有线程执行相同指令。那么每两个执行global memory读取操作之间至少要执行多少计算指令(以32位乘法为例),才能掩盖传输延迟?
网上说的global memory的延迟是在400 - 800 cycles,这个延迟是指一次ld/st操作的延迟么?如果1024个线程都进行global memory 读操作,SMX的ld/st单元个数为32个,那么所有的读操作完成至少需要400*32 cycles?如果不满足coalescing,还需要更多的延迟。
楼主您好:
(1)
你不是在连续2次global读取间需要多少条计算指令,而是在您一次读取后,中间经过多少条计算指令后,用到刚才读取的数据的指令才能无阻碍的执行。(想想为何如此)
在问题修改成这样的前提下,采用您给定的数据(500个周期的读取延迟,中间夹杂的是32位乘法),那么您的一个SMX需要中间间隔500条乘法指令(指令数目按warp计)(因为您要求给出的32位整数指令正好只有1组SP能执行)。该500条指令间杂在需要使用刚才读取的数据的指令中间执行,方能保证这条需要数据的指令无碍的执行。(这500条不一定来自本warp,也可以来自其他warp)。
(2)如果每次传输的大小<=64B(例如warp在读取的是32个连续1B) 且排列在64B的边界,且在3.0上),且假设L2 100% hit, 且只有当前执行测试的SMX在忙碌,其他SMX完全空闲:则使用您给出的L2到寄存器延迟为500个周期的数据,则您一共需要500+1023个周期就可以让这批数据完全抵达。
感谢深夜来访。
关于第(2)点:
1、ld/st单元需要等上一次请求结束,才能接受下一次请求么?
2、500+1023周期中的1023是怎么产生的,是因为coalescing的原因么?是说在不满足coalescing的情况下,是500+1023周期?在满足coalescing的情况下,周期数为500+ 32?
我拒绝就此问题发表进一步的任何解释。
那只会进一步浪费你我的时间
好吧!如果时间允许的话,能否回答一个选择题呢,不需要解释。
A、ld\st单元是同步的,一个访问请求必须完成之后,才能接受下一个访问请求。
B、ld\st单元是异步的,允许多个访问请求同时进行。
C、以上都不对。
楼主您好,
您可以大致理解成LSU可以同时在处理多个请求,而无需前一个完全完成才能进行下一个。
感谢来访。