SIMD
SIMD
SIMD.js已经从TC39的主动开发中退出,并从第三阶段移除。web浏览器不再追求它的实现。SIMD在web上公开的操作基于SIMD.js操作,在WebAssembly中处于活动开发状态
SIMD(发音为“SIM-DEE”)是短于单指令/多数据
是一个计算机架构的分类。SIMD操作在多个数据点上执行相同的计算,从而导致数据级并行性,并因此提高性能,例如用于3D图形和视频处理,物理学模拟或密码学以及其他领域。
本页面和子页面是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有符号整数类型
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%.load()
SIMD.%type%.load1()
SIMD.%type%.load2()
SIMD.%type%.load3()
返回一个新的实例,其中从一个类型数组中加载通道值。SIMD.%type%.store()SIMD.%type%.store1()SIMD.%type%.store2()SIMD.%type%.store3()
将SIMD数据类型存储到类型数组中。
算术运算
SIMD.%FloatType%.abs()
用绝对通道值返回一个新实例。
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.%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原型
下面的方法和属性被安装在SIMD.%type%.prototype
。
SIMD.%type%.prototype.constructor
指定创建SIMD对象原型的函数。
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 |