GPU是一个异构的多处理器芯片,为从图形图像处理优化
shader core 是个渲染器
work Distributer是个管理器
Execute shader执行单元就是一个完整的小处理器,有自己的取值译码单元,alu处理核心和执行上下文
CPU-style cores多了个很大数据缓存,out of order控制逻辑,分支预测,存储器的控制单元,但是这些却花了绝大部分的芯片面积和价钱
思路1:精简,减肥slimming down
Idea#1 Remove components that help single instruction stream run fast
two cores(two fragments in parallel) 这就是双核嘛,既然两个可以做,我们也可以做四个,十六个,同事执行十六个程序片元
16 simultaneous insturctions stream
but many fragments should be able to share an instruction stream!指令流共享,多个程序片共享指令流
思路2:增加ALU ,SIMD ,改进的处理单元,我们就可以执行向量的操作
后来两种合并,有128个程序片元同时执行(ALU),并发16路指令流
这样带来些问题,分支处理如何办?就是ifelse语句的时候,很多语句并发执行,有true和false,所以并不是每个alu在做有效的工作
SIMD处理并不总是需要显式的SIMD指令
stall停滞,怎么办,数据过来缓慢:大量的独立片元相互切换,通过片元切换换来掩藏延迟
hiding shader stalls 分配四个任务,在一个任务停滞的时候,去干些变得,这样获得较高的吞吐率,必须是独立的工作,占满等待的时间
上下文存储空间storing contexts,这个变多,变的很多,就会有好的延迟掩藏的效果
上下文切换可以软件也可以硬件管理或者同时管理