GPU相比CPU更适合连续的同质的运算。
原因:
GPU有更多算术运算单元(ALU)
支持多线程处理分支
wrap独占寄存器
...
单指令多数据(SIMD):每次取一条指令,应用到多个不同数据计算的计算上。
单指令多线程(SIMT):会把程序分支分布到不同线程上,线程组执行每执行指令会更新掩码告知下一个指令由哪一条线程执行。
掩码叫Active Mask,粒度为wrap。同时多个分支时,每次执行命令会根据掩码关闭寄存器的写,掩码关闭但对应的线程会空跑,只是不能写寄存器。这就导致一个wrap若同时处理到多种分支情况,会将不同分支计算会分命令批次写入寄存器,导致计算变慢。就像一个开关控制多条铁路的转向。
在GPU中并行执行的一组线程称为Wrap。
Wrap的大小为16~64个线程。
gpu合并存储访问(Coalescing Memory Accesses):从内存中读取32~128bytes的连续内存块,称为Transaction。cache missing就会影响效率。
推荐:
字节对齐。
Structure of array。
连续访问,减少随机访问。
gpu延迟隐藏:当wrap读取内存数据时耗时大,该机制将该wrap冻结并将其运算资源(ALU)分配给其他Wrap。
GPU切换线程比CPU块,因为CPU切换 线程需要将寄存器的值写回内存(即保存上下文),而GPU是wrap独占寄存器,不需要将寄存器写回内存。