返回介绍

第一部分 类型和语法

第二部分 异步和性能

5.2 SIMD

发布于 2023-05-24 16:38:21 字数 1795 浏览 0 评论 0 收藏 0

单指令多数据(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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文