SIMD 是单指令多数据(Single Instruction Multiple Data)的缩写 , 意思是一次对多条数据进行操作. 比如, 一条 SIMD 加法指令能同时对多条数据进行加法运算. SIMD 这种能提高运算速度的技术, 在图形处理, 音频处理, 编码, 物理仿真, 加密等领域中得到广泛应用。
SIMD 一条指令能执行多个操作, 不但提高性能, 而且省电。
SIMD.js 是 Intel, Google, 和 Mozilla 联合开发的 JavaScript API, 其中包含几个新的类型跟函数. 比如, 其中一个新类叫 Float32x4, 它的功能是将 4 个 float32 值打包放在一起. API 中还包含对这些新类型进行算术运算, 排列, 加载, 存储操作的函数. 目的是在浏览器中实现 SIMD API, 并在现有的硬件上跑起来.
目前主要支持带 SSE 的 x86 平台和 带 NEON 的 ARM 平台. 其他平台(如:MIPS, Power)的支持还在考虑中 .
SIMD.js继承自Dart SIMD规范,它正快速演变为更通用的API,并且覆盖了额外的用例(use case),如那些需要更小的整型,包括Int8x16和Int16x8,以及饱和操作(saturating operations).
SIMD.js是低层次的API,库需要以它为基础来编写,以暴露更高层次的功能,如矩阵操作,超越函数等等.
除了可以在regular JS里面使用之外,将SIMD.js增加到asm.js的工作也在进行之中,这样,它就可以在asm.js程序中使用,如由Emscripten编写的程序.在Emscripten之中,SIMD可以通过内建的自动矢量化,通用SIMD拓展, 或者 新的(正在增加)Emscripten特有的API来实现. Emscripten将围绕SIMD.js实现流行的头文件的子集的包装器,如<xmmintrin.h>,作为某些情况下简化移植SIMD代码的方法.
SIMD.js API处于活跃的开发之中. 其中ecmascript_simd github仓库当前正作为一个条款规范,同时也提供polyfill的实现以提供给功能,当然,不是加速性能,是存在于浏览器的SIMD API.它也包含一些性能检测,作为SIMD.js基本用法的一些例子.
要查看SIMD.js的实际应用,可点击伴随IDF2014会谈的关于SIMD.js的demo页面.
API已经提交到TC-39, 它已经认可为阶段1(草案). 为其它阶段的准备工作则处于进行之中,正在向最终API一步步靠近.
在Firefox Nightly中实现的SIMD.js正处于活跃的开发之中. Internet Explorer已经将SIMD.js列入 “考虑之中”. 同时,在Chromium的分支之中,也有一个原型的实现.
SIMD的其中一个应用是,加速处理大数组数据。假如,有一个由N个元素构成的数组,并且需要对数组中的每个元素做大致相同的处理,你可以用 N除以任意平台允许的SIMD大小,并且可以运行很多SIMD的子实例。因为N可以无限大,我把此类问题叫作长SIMD问题。
SIMD的另一个应用是加速集合数据的处理。 RGB或RGBA像素(集),XYZW坐标系,或4×4距阵都都是此种应用的例子。 我把诸如此类的问题叫作短SIMD问题。
SIMD 是一个很广的领域,它的最短和最长的边界并不明确。但在一个高层次的角度来说,这两种风格差别很大,甚至是描述它们的术语也不一样:在短SIMD的世界里,将标量值拷贝到一个向量的每一个元素之中的操作称为"splat";而在长向量世界里,相似的操作则称为"broadcast"。
SIMD.js 主要是"短"风格的API,它适用于解决短SIMD的问题。SIMD.js也可以用作解决长SIMD的问题。相对于平常的标量代码,它有较明显的加速。然而,对于现在的一些CPU,它的固定长度类型不能实现最大的性能。因此,仍有开发其它的解决方案来提升性能的空间。
在两方面的需求之中,SIMD.js 的许多部分都有天然的冲突,一方面是希望拥有稳定运行在所有重要平台的API,另一方面是希望在每一个单独的平台下都尽可能快的运行。
幸运的是,有一套核心的操作集合可以稳定存在于广泛的平台之中。这些操作包括大多数的基础算术运算操作,它们组成了 SIMD.js 的核心。在这个集合中,几乎没有额外开销,因为许多相关的 SIMD API 指令直接映射到单独的指令。
但是,也有许多操作在一个平台运行良好,却在其它平台运行很差.这会导致令人吃惊的性能差异。当前的方法是让SIMD.js API集中于它所擅长的事情,并尽可能降低性能差异。它也会专注于提供可移植的方法。综合来看,目标在于保证,在一个平台运行良好的程序,在其它平台也可以运行,并运行的很好。
在SIMD.js未来的迭代之中,我们希望拓展作用范围,除了包含潜在平台下的查询功能,还包含更多的功能。类似于WebGL,这将允许程序决定什么功能对它们可用,这样,它们可以决定是否回退到未更新的代码,或屏蔽可选功能。
SIMD.js 将会在广大的范围内加速现今高要求的应用程序,包括游戏,视频,音频操控,科学模拟以及其它Web应用程序。应用程序将可以直接使用SIMD.js API。库则使用SIMD.js来暴露高层级的接口以供应用程序使用。Emscripten 将使用流行的SIMD来编译C++,以生成优化后的SIMD.js代码。
未来,SIMD.js 将会持续增长,将会提供更广泛的功能:我们希望SIMD.js最终也会有长SIMD风格的API。这样,两种API可以相互合作,类似于OpenCL结合显式向量类型和隐式长向量潜在编程模型的平行性。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务