SIMD
SIMD.js已经从TC39的主动开发中退出,并从第三阶段移除。web浏览器不再追求它的实现。SIMD在web上公开的操作基于SIMD.js操作,在WebAssembly中处于活动开发状态
本页面和子页面是SIMD API参考文档。另见SIMD类型的描述在JavaScript SIMD更普遍的文章。
描述
JavaScript SIMD API由几个新的类型和操作组成。浏览器根据用户的底层硬件提供高度优化的API实现。目前,SIMD专门针对NEON(http://en.wikipedia.org/wiki/ ARM 架构#Advanced_SIMD(NEON%29))和x86平台(带有SSE)的ARMv7平台进行建模。
SIMD API类型安装在SIMD
模块上。不像其他全局对象,SIMD
不是一个构造函数。您不能将其与new
运算符一起使用,或者将其SIMD
作为函数调用。所有属性和方法SIMD
都是静态的(就像Math
对象一样)。
概览
一个SIMD值有多个通道。对于长度为4的矢量,通道被命名为x
,y
,z
,和w
。现在,SIMD不必对每个通道执行4个独立的操作,而是允许您同时对所有4个通道执行操作。与标量操作(SISD)相比,这需要更少的操作,从而导致性能改进和更高的能源效率。请注意,SIMD操作不能用于以不同方式处理多个数据。在下图中,只有一个指令(加法),因此可以用SIMD进行操作:


图1和图2:SISD和SIMD比较。
简单的加法运算
图2所示的简单SIMD操作的JavaScript代码如下所示:
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a,b); // Float32x4[6,8,10,12]
数据类型
所有SIMD数据类型都是不可变的。你不能直接改变它们。而是执行创建新的不可变SIMD数据类型的操作。
下图显示了128位SIMD寄存器中的不同SIMD数据类型。目前的SIMD JavaScript API有12种不同的类型,通道长度为2,4,8或16。

图3:128位SIMD寄存器中的每种类型的通道
SIMD布尔类型
SIMD.Bool8x16
128位分成16个存储布尔值的通道。
SIMD.Bool16x8
128位分成8个存储布尔值的通道。
SIMD.Bool32x4
128位分成4个存储布尔值的通道。
SIMD.Bool64x2
128位分成2个存储布尔值的通道。
SIMD有符号整数类型
SIMD.Int8x16
128位分成16个存储8位有符号整数值的通道。SIMD.Int16x8
128位分成8个存储16位有符号整数值的通道。SIMD.Int32x4
128位分为4个存储32位有符号整数值的通道。
SIMD无符号整数类型
SIMD.Uint8x16
128位分为16个存储8位无符号整数值的通道。SIMD.Uint16x8
128位分成8个存储16位无符号整数值的通道。SIMD.Uint32x4
128位分成4个存储32位无符号整数值的通道。
SIMD浮点类型
SIMD.Float32x4
128位分为4个存储单精度浮点值的通道。SIMD.Float64x2
128位分成2个存储双精度浮点值的通道。
构造函数
除了简单的创建者函数(例如SIMD.Int32x4(1,2,3,4)
)之外,SIMD API还提供以下构造函数:
SIMD.%type%.splat()
创建所有通道设置为给定值的SIMD数据类型。
您也可以从一种SIMD数据类型转换为另一种。
注意: SIMD类型不起作用new
,因为SIMD值不是“盒装”对象(可String(s)
与new String(s)
创建String对象的vs 比较)。
var v = new SIMD.Float32x4(0,1,2,3);
// TypeError: SIMD.Float32x4 is not a constructor
作为替代,你只需要写
var v = SIMD.Float32x4(0,1,2,3);
操作
要真正需要SIMD类型来执行操作,SIMD操作需要在SIMD数据类型上工作。
注意:并非所有SIMD操作都适用于所有SIMD类型,请参阅个别参考页以了解详细信息和可用性。
检查SIMD类型
SIMD.%type%.check()
如果参数是一个有效的SIMD数据类型,则返回一个新的实例%type%
。否则抛出TypeError
访问和变异通道
SIMD.%type%.extractLane()
返回给定通道的值。
SIMD.%type%.replaceLane()
返回给定通道值替换的新实例。
从类型数组中加载和存储
SIMD.%type%.load()
SIMD.%type%.load1()
SIMD.%type%.load2()
算术运算
SIMD.%FloatType%.abs()
用绝对通道值返回一个新实例。
SIMD.%type%.add()
返回添加了通道值的新实例(a + b
)。
SIMD.%type%.addSaturate()
返回一个添加了泳道值的新实例(a + b
)和溢出时的饱和行为。
SIMD.%FloatType%.div()
返回lane值为(a / b
)的新实例。
SIMD.%type%.mul()
返回通道值乘以(a * b
)的新实例。
SIMD.%type%.neg()
返回带有否定通道值的新实例。
SIMD.%FloatType%.reciprocalApproximation()
用倒数通道值的近似值返回一个新实例。
SIMD.%FloatType%.reciprocalSqrtApproximation()
返回具有倒数平方根通道值的近似值的新实例。
SIMD.%type%.sub()
返回带有减去的通道值的新实例(a - b
)。
SIMD.%type%.subSaturate()
返回一个减去通道值的新实例(a - b
)和溢出饱和行为。
SIMD.%FloatType%.sqrt()
返回带有通道值的平方根的新实例。
Shuffling and swizzling
SIMD.%type%.shuffle()
Returns a new instance with the lane values shuffled.SIMD.%type%.swizzle()
Returns a new instance with the lane values swizzled.
最小值和最大值
SIMD.%FloatType%.max()
返回具有最大通道值的新实例。SIMD.%FloatType%.maxNum()
返回一个具有最大通道值的新实例,优先选择数字NaN
。
SIMD.%FloatType%.min()
用最小的通道值返回一个新的实例。SIMD.%FloatType%.minNum()
返回一个具有最小通道值的新实例,优先选择数字NaN
。
选项值
SIMD.%type%.select()
返回一个新的实例,其中通道值是通道的混合,具体取决于选择器掩码。
比较
SIMD.%type%.equal()
返回取决于的选择掩码a == b
。SIMD.%type%.notEqual()
返回取决于的选择掩码a != b
。SIMD.%type%.lessThan()
返回取决于的选择掩码a < b
。SIMD.%type%.lessThanOrEqual()
返回取决于的选择掩码a <= b
。SIMD.%type%.greaterThan()
返回取决于的选择掩码a > b
。SIMD.%type%.greaterThanOrEqual()
返回取决于的选择掩码a >= b
。
按位逻辑操作
SIMD.%type%.and()
用通道值(a & b
)的逻辑与返回一个新的实例。SIMD.%type%.or()
返回一个带有通道值(a | b
)的逻辑或的新实例。SIMD.%type%.xor()
返回带有通道值(a ^ b
)的逻辑异或的新实例。SIMD.%type%.not()
返回带有逻辑非通道值(~a
)的新实例。
按位移动操作
SIMD.%IntegerType%.shiftLeftByScalar()
返回一个新的实例,将通道值左移一个给定的位数(a << bits
)。SIMD.%IntegerType%.shiftRightByScalar()
返回通道值向右移动的新实例。行为取决于基础类型是有符号还是无符号。
布尔运算
SIMD.%BooleanType%.allTrue()
检查是否所有车道都有true
价值。SIMD.%BooleanType%.anyTrue()
检查任何车道是否true
有价值。
数据转换
SIMD.%type%.fromFloat32x4()
通过Float32x4的浮点数转换创建一个新的SIMD数据类型。
SIMD.%type%.fromFloat32x4Bits()
使用Float32x4的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromFloat64x2Bits()
使用Float64x2的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromInt32x4()
使用In32x4的整数转换创建新的SIMD数据类型。
SIMD.%type%.fromInt32x4Bits()
使用Int32x4的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromInt16x8Bits()
使用Int16x8的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromInt8x16Bits()
使用Int8x16的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromUint32x4()
使用Uin32x4的整数转换创建新的SIMD数据类型。
SIMD.%type%.fromUint32x4Bits()
使用Uint32x4的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromUint16x8Bits()
使用Uint16x8的按位副本创建新的SIMD数据类型。
SIMD.%type%.fromUint8x16Bits()
使用Uint8x16的按位副本创建新的SIMD数据类型。
SIMD原型
下面的方法和属性被安装在SIMD.%type%.prototype
。
SIMD.%type%.prototype.constructor
指定创建SIMD对象原型的函数。
SIMD.%type%.prototype.toLocaleString()
返回表示SIMD类型及其元素的本地化字符串。重写该Object.prototype.toLocaleString()
方法。
SIMD.%type%.prototype.toString()
返回表示SIMD类型及其元素的字符串。重写该Object.prototype.toString()
方法。
SIMD.%type%.prototype.valueOf()
返回SIMD对象的原始值。
SIMD.%type%.prototype.toSource()
返回表示对象源代码的字符串。重写该Object.prototype.toSource()
方法。
Polyfill
基于类型数组的一个Polyfill实现可在ecmascript_simd GitHub存储库中找到。
规范
Specification | Status | Comment |
---|---|---|
SIMDThe definition of 'SIMD' in that specification. | Draft | Initial definition. |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Edge | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Float32x4 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Float64x2 | No support | Nightly build | No support | No support | No support | No support |
SIMD.Int8x16 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Int16x8 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Int32x4 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint8x16 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint16x8 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint32x4 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool8x16 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool16x8 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool32x4 | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool64x2 | No support | Nightly build | No support | No support | No support | No support |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | Edge | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Float32x4 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Float64x2 | No support | No support | Nightly build | No support | No support | No support | No support |
SIMD.Int8x16 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Int16x8 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Int32x4 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint8x16 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint16x8 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Uint32x4 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool8x16 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool16x8 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool32x4 | No support | No support | Nightly build | Nightly build | No support | No support | No support |
SIMD.Bool64x2 | No support | No support | Nightly build | No support | No support | No support | No support |
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com