|
|
原帖由 killpmp 于 2007-7-20 23:35 发表 ![]()
对不起,你概念性错误we.pcinlife.com6^2kBJ9?$@ E
你所谓的“分支预测”在R6xx体系中是驱动程序管的事情,跟GPU根本无关。GPU没有你所谓的“分支预测”。驱动程序负责需要执行的指令的编排问题,然后交给GPU去做
^1S:T8|?]`@V_}
你所谓的“Cache不命中”才是分支预测,但R6xx GPU是不具备分支预测功能的,毕竟它不是CPU.f$pkU8Z8c!F'P
指令的重编排叫做乱序执行。分支预测是找到当前程序点下面语句最常用的分支,无论此分支条件满足都预先执行,由于是和当前指令几乎并行执行的,因此损耗比较小。驱动所做的优化应该和编译器优化类似,将最常用的分支提前,或对分支合并。
Cache不命中和分支预测没有任何关系,硬盘也有Cache不命中的问题。Cache只是一个更快的存储器,处理器将程序经常访问的内存数据和指令暂存在Cache中以加快访问速度,Cache命中率低下会造成反效果。
如果还是不明白,我再说清楚一点,看这段代码(假如有变量i是经过前面程序计算的值):
j *=j
if(i>0)
k++;
else
k--;
分支预测的过程是,CPU预测i>0的分支最常被执行,因此在执行j*=j时,k++会被几乎同时执行。然而如果i<=0时,分支预测失败,流水线请空,重新计算k--。当然,我从版主那知道GPU没有分支预测。
什么是指令Cache不命中?拿CPU做比喻吧,现代CPU都是32位,但是指令长度没有32位,另外,内存比较慢(相对CPU来说)。不可能每执行一条语句再问内存取一条语句,这个时候CPU从内存从取一块语句到Cache中,这里不存在预测,直接是当前语句后面连续的内存地址。但是分支造成这块语句不一定被执行,这时候又需要取另一块语句块了,这个过程就是指令Cache不命中。
我想我说得比较清楚了吧,而且这样不是Google抄来的吧? |
|