Post
Topic
Board 挖矿
Re: CPU->GPU->ASIC->Memory
by
lanfanblue
on 15/12/2013, 06:09:24 UTC
我上一次回复用的单位都是“每秒”,其实我是想避开时钟周期的问题,避免讨论流水线。因为流水线过于底层了,而且详细分析流水线的结果,其实和在更高抽象层次分析的结果是一样的…………
不过既然已经打开流水线话题了,那就聊聊吧。

简单说几个前提:
流水线对于IC设计者来说并不复杂,事实上这算是IC设计的基本功了。如果觉得设计流水线对性能有帮助,就尽管让IC设计者做流水线,如果他做不出来,那就炒了他吧。实际上,IC设计者应该主动去设计流水线。
可以参考BTC的FPGA矿机Verilog代码(里面有个UNROLL参数用于调整流水线深度),现在的BTC ASIC设计基本上都是64级流水线:每一次计算都需要经历64个周期,但每个周期都会有1个结果输出。
习惯上来讲,64个周期完成64个结果,我们还是会称其1个周期完成1个结果。因为从平均状态上来看,两者性能是一样的。也就是说,我最开始那一次回复里提到的“一个周期完成一次运算”也隐含了流水线设计。

另外,我们要统一一下流水线的架构,就借用你所熟悉的CPU架构吧。每一个CPU处理器核心,只拥有一条流水线(不考虑超线程或其他类似技术),只能访问一块L1 Cache的数据(L2 Cache和主内存的访问属于memory hierarchy的问题)。多核处理器有多个核心,多条流水线,多块L1 Cache。讨论流水线的话,先考虑单核处理器,多核属于并行化的问题。
说到这里,应该比较清楚了吧。一条流水线里,无论分多少级,里面各级所连接的内存是同一块!
如果分64级,对于某一个特定的运算过程而言,它的内存带宽占用确实减小到了1/64;但是,在同一时刻,流水线里还在执行着其他63个不同的运算,这些运算也都需要占用内存带宽。从平均状态来看,和1个周期完成1次运算所占用的内存带宽是一样的。
换个角度考虑,假设64级流水线中,只有1级是需要访问内存的(类似于CPU流水线的memory access级)。那么每一个时钟周期内,都有不同的运算需要访问内存,所需的内存带宽其实也没变。
考虑内存带宽时,我个人喜欢直接从内存的角度来看问题,在处理单元角度看有点绕。在这个问题里,可以这么想。若要1个周期内完成1次运算,无论有没有流水线,它都需要访问128k内存(假设128k),那么时钟为1M的话,它所需要的带宽就是128GB/s。这个带宽需求无论怎样改设计,都无法改变。
所以我说:无论是从处理器流水线的角度去看,还是从更高抽象层次去看,结果都是一样的……

希望我描述清楚了