非常教程

JavaScript参考手册

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进行操作:

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。

SIMD

图3:128位SIMD寄存器中的每种类型的通道

SIMD布尔类型

SIMD.Bool8x16128位分成16个存储布尔值的通道。

SIMD.Bool16x8128位分成8个存储布尔值的通道。

SIMD.Bool32x4128位分成4个存储布尔值的通道。

SIMD.Bool64x2128位分成2个存储布尔值的通道。

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%.replaceLane()返回给定通道值替换的新实例。

从类型数组中加载和存储

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()用绝对通道值返回一个新实例。

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 == bSIMD.%type%.notEqual()返回取决于的选择掩码a != bSIMD.%type%.lessThan()返回取决于的选择掩码a < bSIMD.%type%.lessThanOrEqual()返回取决于的选择掩码a <= bSIMD.%type%.greaterThan()返回取决于的选择掩码a > bSIMD.%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

SIMD
SIMD.abs 详细
SIMD.add 详细
SIMD.addSaturate 详细
SIMD.allTrue 详细
SIMD.and 详细
SIMD.anyTrue 详细
SIMD.Bool16x8 详细
SIMD.Bool32x4 详细
SIMD.Bool64x2 详细
SIMD.Bool8x16 详细
SIMD.check 详细
SIMD.div 详细
SIMD.equal 详细
SIMD.extractLane 详细
SIMD.Float32x4 详细
SIMD.Float64x2 详细
SIMD.fromFloat32x4 详细
SIMD.fromFloat32x4Bits 详细
SIMD.fromFloat64x2Bits 详细
SIMD.fromInt16x8Bits 详细
SIMD.fromInt32x4 详细
SIMD.fromInt32x4Bits 详细
SIMD.fromInt8x16Bits 详细
SIMD.fromUint16x8Bits 详细
SIMD.fromUint32x4 详细
SIMD.fromUint32x4Bits 详细
SIMD.fromUint8x16Bits 详细
SIMD.greaterThan 详细
SIMD.greaterThanOrEqual 详细
SIMD.Int16x8 详细
SIMD.Int32x4 详细
SIMD.Int8x16 详细
SIMD.lessThan 详细
SIMD.lessThanOrEqual 详细
SIMD.load 详细
SIMD.max 详细
SIMD.maxNum 详细
SIMD.min 详细
SIMD.minNum 详细
SIMD.mul 详细
SIMD.neg 详细
SIMD.not 详细
SIMD.notEqual 详细
SIMD.or 详细
SIMD.reciprocalApproximation 详细
SIMD.reciprocalSqrtApproximation 详细
SIMD.replaceLane 详细
SIMD.select 详细
SIMD.shiftLeftByScalar 详细
SIMD.shiftRightByScalar 详细
SIMD.shuffle 详细
SIMD.splat 详细
SIMD.sqrt 详细
SIMD.store 详细
SIMD.sub 详细
SIMD.subSaturate 详细
SIMD.swizzle 详细
sIMD.toString 详细
SIMD.Uint16x8 详细
SIMD.Uint32x4 详细
SIMD.Uint8x16 详细
sIMD.valueOf 详细
SIMD.xor 详细
JavaScript

JavaScript 是一种高级编程语言,通过解释执行,是一门动态类型,面向对象(基于原型)的解释型语言。它已经由ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器( Chrome、IE、FireFox、Safari、Opera )支持。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络