xqscan 的讨论

发布于: 雪球回复:0喜欢:12
GPGPU 的前身可以追溯到向量机,即以向量为最小数据单元做通用计算,相比之下 CPU 是在标量上做计算;GPU 适合对大量数据做相同的简单操作(所谓面向吞吐),CPU 适合对少量数据做复杂操作(所谓面向延迟)

出于图像/视频处理的需要,CPU 也引入了向量指令集叫 SIMD,而 GPGPU 相比 SIMD 除了向量规模更大之外,还有一大特点是"以标量编码以向量执行",这叫做 SIMT,由 GPU 着色器泛化而来由 CUDA 首次引入;因为标量编码是最常见的编程模型,所以很多现成的 C/C++ 代码可以直接在 CUDA 中使用同时得到了数据级并行的能力,这是 CUDA/OpenCL 能大行其道的原因,门槛和工作量远远比 SIMD 低

既然 CPU/GPGPU 已经通用到可以直接运行 C/C++ 这些图灵完备的语言,也就不难理解任何基于 C 语言实现的算法包括深度学习都能够运行于 CPU/GPU 之上,此为深度学习算法的软实现(可编程);相比之下,NPU 可以视作 GPGPU 的一种深度学习算法定制优化设备(Tensor 本来就是高维向量,由向量机来实现也很自然),即根据深度学习计算的特点,定制一些硬件部件,比如直接提供乘累加/矩阵乘/向量内积/向量外积甚至卷积单元(算得快),比如提供16位浮点8比特定点甚至1比特精度的数据类型(不像超算上的一些算法要求64位浮点精度),比如提供上百 MB 的 SRAM 直接将模型置于其中避免绝大部分存储器访问(又快功耗又低);换句话说,NPU 可以无所不用其极的去挖掘深度学习计算的特点并将其固化,而通用计算设备如 CPU/GPGPU 会倾向于只提供有限的扩展指令尽量软实现各种操作,目前 Intel/Nvidia 的共识是只要提供矩阵乘单元,然后将主要的计算密集算子规约为矩阵乘,就足以得到与 NPU 匹敌的深度学习性能了