5.2 SIMD
单指令多数据(SIMD)是一种数据并行 (data parallelism)方式,与 Web Worker 的任务并行 (task parallelism)相对,因为这里的重点实际上不再是把程序逻辑分成并行的块,而是并行处理数据的多个位。
通过 SIMD,线程不再提供并行。取而代之的是,现代 CPU 通过数字“向量”(特定类型的数组),以及可以在所有这些数字上并行操作的指令,来提供 SIMD 功能。这是利用低级指令级并行的底层运算。
把 SIMD 功能暴露到 JavaScript 的尝试最初是由 Intel 发起的(https://01.org/node/1495 ),具体来说就是,Mohammad Haghighat(在本书写作时)与 Firefox 和 Chrome 团队合作。SIMD 目前正在进行早期的标准化,很有机会进入到 JavaScript 的未来版本,比如 ES7。
SIMD JavaScript 计划向 JavaScript 代码暴露短向量类型和 API。在支持 SIMD 的那些系统中,这些运算将会直接映射到等价的 CPU 指令,而在非 SIMD 系统中就会退化回非并行化的运算。
对于数据密集型的应用(信号分析、关于图形的矩阵运算,等等),这样的并行数学处理带来的性能收益是非常明显的!
在本书写作时,早期提案中的 API 形式类似如下:
var v1 = SIMD.float32x4( 3.14159, 21.0, 32.3, 55.55 ); var v2 = SIMD.float32x4( 2.1, 3.2, 4.3, 5.4 ); var v3 = SIMD.int32x4( 10, 101, 1001, 10001 ); var v4 = SIMD.int32x4( 10, 20, 30, 40 ); SIMD.float32x4.mul( v1, v2 ); // [ 6.597339, 67.2, 138.89, 299.97 ] SIMD.int32x4.add( v3, v4 ); // [ 20, 121, 1031, 10041 ]
这里展示的是两个不同的向量数据类型,32 位浮点数和 32 位整型。可以看到,这些向量大小恰好就是四个 32 位元素,因为这和多数当代 CPU 上支持的 SIMD 向量大小(128 位)匹配。未来还有可能看到这些 API 的 x8 (或更大!)版本。
除了 mul() 和 add() ,很多其他运算还可以包含在内,比如 sub() 、div() 、abs() 、neg() 、sqrt() 、reciprocal() 、reciprocalSqrt() (算术)、shuffle() (重新安排向量元素)、and() 、or() 、xor() 、not() (逻辑)、equal() 、greaterThan() 、lessThan() (比较)、shiftLeft() 、shiftRightLogical() 、shiftRightArithmetic() (移位)、fromFloat32x4() 以及 fromInt32x4() (转换)。
对于可用的 SIMD 功能(http://github.com/johnmccutchan/ecmascript_simd ),有一个官方的(有希望的、值得期待的、面向未来的)prolyfill,它展示了比我们这一节中多得多的计划好的 SIMD 功能。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论