你说的x86是泛指一般的high performance CPU吧。 主要就是那些有speculation和OOO的能力的. 支持X86 ISA的处理器只是其中的一部分. 我的意思是说,GPU运行单个thread的性能本来就是一般的, GPU本来就是靠并行计算来提供throughtput的,所以烂代码其实无所谓. 从你说的吃烂代码的角度看,如果衡量throughput, GPU的multi-threading不比CPU的speculation的效果差。举个简单的例子,程序A不考虑memory locality和data reuse, CPU可以prefetch, 可以speculate load, 可以OOO load, 可以上大cache, 来解决long memory latency的问题. GPU里面则可以通过multi-threading, 一旦有个thread读内存了,就切换到另外一个thread, 等memory的数读回来了,再切换回原先那个thread. 只要有足够多的threads来hide latency, 这个memory latency 根本不是问题,即使没有CPU那些tricks, GPU的throughput也照样很高. 再比如,一个烂程序有很多不必要的branches, CPU里面通过BTB和branch predictor可以把branch miss penalty降得很低。GPU虽然没有这些设计,可是GPU有很多threads, 一个thread遇到branch instruction的时候,这个thread的instruction fetch就被停掉。 如果在CPU里面这么做,pipeline就会出现bubble导致性能下降. 但是GPU有很多threads, 总是能把pipeline填满,所以这根本不是问题.
总而言之,在GPU上面单个thread的性能的确是惨不忍睹,但是如果你的CUDA程序写得好,把一个问题通过大量的并行的threads来解决,这个单个thread的性能根本不是问题.
"IMHO放到CPU上面也适用."
如果您说的CPU是x86的话, 我认为是不适用的. x86做的这么多事情, 就是为了用来吃烂代码的. 同样烂的代码放到Power, CELL之类的架构上, 一般都会变得非常糟糕, 到CUDA上则是只能说惨不忍 ...
RacingPHT 发表于 2009-10-3 15:33 ![]() |