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的矢量,通道被命名为xyz,和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.Bool8x16128位分成16个存储布尔值的通道。

SIMD有符号整数类型

SIMD.Int8x16128位分成16个存储8位有符号整数值的通道。SIMD.Int16x8128位分成8个存储16位有符号整数值的通道。SIMD.Int32x4128位分为4个存储32位有符号整数值的通道。

SIMD无符号整数类型

SIMD.Uint8x16128位分为16个存储8位无符号整数值的通道。SIMD.Uint16x8128位分成8个存储16位无符号整数值的通道。SIMD.Uint32x4128位分成4个存储32位无符号整数值的通道。

SIMD浮点类型

SIMD.Float32x4128位分为4个存储单精度浮点值的通道。SIMD.Float64x2128位分成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存储库中找到。

规范

SpecificationStatusComment
SIMDThe definition of 'SIMD' in that specification.DraftInitial definition.

浏览器兼容性

FeatureChromeFirefox (Gecko)EdgeInternet ExplorerOperaSafari
Basic supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Float32x4No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Float64x2No supportNightly buildNo supportNo supportNo supportNo support
SIMD.Int8x16No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Int16x8No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Int32x4No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint8x16No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint16x8No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint32x4No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool8x16No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool16x8No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool32x4No supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool64x2No supportNightly buildNo supportNo supportNo supportNo support

FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)EdgeIE MobileOpera MobileSafari Mobile
Basic supportNo supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Float32x4No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Float64x2No supportNo supportNightly buildNo supportNo supportNo supportNo support
SIMD.Int8x16No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Int16x8No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Int32x4No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint8x16No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint16x8No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Uint32x4No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool8x16No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool16x8No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool32x4No supportNo supportNightly buildNightly buildNo supportNo supportNo support
SIMD.Bool64x2No supportNo supportNightly buildNo supportNo supportNo supportNo support