Kepler GK110 的新 SMX 引入几个架构创新,使其不仅成为有史以来最强大的多处理器,而且更具编程性,更节能。
1. 四Warp调度机制
SMX 以 32 个并行线程为一组的形式调度进程,这 32 个并行线程叫做 Warp。而每个 SMX中拥有四组 WarpScheduler 和八组 Instruction Dispatch 单元,允许四个 Warp 同时发出执行。Kepler的 QuadWarp Scheduler 选择四个 Warp,在每个循环中可以指派每Warp 2 个独立的指令。Fermi 不允许双精度指令和部分其他指令配对,而 Kepler GK110 允许双精度指令和其他特定没有注册文件读取的指令配对 例如加载/存储指令、纹理指令以及一些整数型指令。
Kepler 和 FermiScheduler 包含类似的硬件单元来处理调度功能。其中包括:
a) 记录长延迟操作(纹理和加载)的寄存器
b) Warp 内调度决定(例如在合适的候在 Warp 中挑选出最佳Warp运行)
c) 线程块级调度(例如,GigaThread 引擎)
2. 新 ISA 编码:每个线程 255 个寄存器
可由线程访问的寄存器的数量在 GK110中已经翻了两番,允许线程最多访问 255 个寄存器。
2.1 Shuffle 指令
为了进一步提高性能,Kepler 采用 Shuffle指令,它允许线程在 Warp 中共享数据。此前,Warp 内线程之间的数据共享需要以共享内存传递数据的方式来实现存储和加载操作。使用Shuffle 指令,Warp可以读取来自Warp内其他线程中任意排列的值。Shuffle 支持任意索引引用(即任何线程读取任何其他线程)。
Shuffle 性能优于共享内存,因此存储和加载操作能够一步完成。Shuffle也可以减少每个线程块所需共享内存的数量,因为数据在 Warp 级交换也不需要放置在共享内存中。
2.2 原子运算
原子内存运算允许并发线程对共享数据结构执行正确的读‐修改‐写运算。
Kepler GK110 全局内存原子运算的吞吐量较 Fermi 时代有大幅的提高。普通全局内存地址的原子运算吞吐量相对于每频率一个运算来说提高了 9 倍。独立的全局地址的原子运算的吞吐量也明显加快,而且处理地址冲突的逻辑已经变得更有效。原子运算通常可以按照类似全局负载运算的速度进行处理。此速度的提高使得原子运算足够快得在内核内部循环中使用,消除之前一些算法整合结果所需要的单独的归约传递。
2.3 纹理改进
? Kepler 中的纹理吞吐量与 Fermi 相比有明显提高,每个 SMX 单元包含 16 纹理过滤单元,对比 Fermi GF110 SM 提高了 4 倍。
? Kepler 改变了管理纹理状态的方法。在 Fermi 时代,为让 GPU 引用纹理,必须在固定大小绑定表中分配“槽”才能启动 Grid。表中槽数量最终限制程序一次可以读取多少个独特的纹理。最终,在 Fermi 中限制程序仅可以同时访问 128 纹理。 Kepler 中无绑定纹理,不需要额外步骤:纹理状态已保存为内存中的对象,硬件按需获取这些状态对象,更新绑定表。