背景
目前对WebAssembly的使用主要是做计算密集型的工作,比如软解播放通过WebAssembly计算提供解码能力,WebAssembly执行完全依赖CPU计算,不能借助GPU硬件加速,所以需要尽量挖掘CPU执行提升程序效率的手段。目前两个主要优化手段为多线程和SIMD。
对于多线程能力的使用,从WebAssembly指令支持层面、编译工具链、线程间内存共享方式、浏览器对WASM标准的实现方面都有相应的支持
而SIMD是另一种能显著提升程序执行效率的方式,需要调研下使用到SIMD特性的源代码编译成WASM的可行性
技术原理
SIMD概念
-
SIMD(单指令多数据流)即一条指令可以一次处理多个数据,属于数据级并行优化手段。非常适用于对大量数据进行相同操作的计算任务,例如图片、音视频编解码处理场景。SIMD在X86、ARM CPU架构下都有相应的指令集实现。
-
-
如图所示,从宏观的角度看SISD(单指令单数据流)和SIMD(单指令多数据流),对数组A、B中对应下标位置的数据进行相加,结果存到数组C中。对于SISD,N次循环操作,每次对一对数据进行处理。对于SIMD,一次操作可以同时处理四对数据,只需要 N/4次循环。两者的主要区别是单次指令执行处理的数据容量不同。
-
-
组成原理基础
-
在继续介绍之前需要先补充一些计算机组成原理的知识。 -
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sU393gDG-1656511217139)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5497bab8bd084a6d8e3c83bd894df0e6~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
-
CPU的基本任务就是执行指令,有三个主要部件,CU(控制单元) 、 ALU(算术逻辑单元)、寄存器(存储单元) -
**控制单元** -
由指令寄存器(Instruction Register)、指令计数器(Program Counter)、指令译码器(Instruction Decoder)和 操作控制器(Operation Controller) 等组成。对指令进行读取解析,控制执行。指令计数器中存放下一条指令在内存中的地址,控制单元根据地址读取指令,放入指令寄存器中,通过指令译码器对指令分析,确定应该进行什么操作,然后通过操作控制器生成控制信号,告诉运算逻辑单元(ALU)和寄存器如何运算、对什么数据进行运算以及对结果进行怎样的处理。 -

-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wz3pkgVm-1656511217140)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/029c4fdb42eb4386a894c96035abb889~tplv-k3u1fbpfcp-zoom-in-crop-mark:1956:0:0:0.image)]
-
**算术逻辑单元** -
-
执行+ - \* / 等算术运算,位移等逻辑运算。由控制单元发出的控制电信号控制运算
-
-
**寄存器** -
-
CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果以及一些CPU运行需要的信息。主要包括通用寄存器、专用寄存器。每个寄存器都有一个特定编号
-
-
-
通用寄存器: 最基础的寄存器,程序执行过程中,绝大部分时间都是在操作这些寄存器来实现指令功能,从内存中读数据至寄存器,ALU运算临时结果存至寄存器等
-
-

本文探讨了WebAssembly在计算密集型任务中的应用,尤其是SIMD(单指令多数据流)技术,以提高程序效率。SIMD允许一次性处理多个数据,尤其适合图像和音视频处理。文章详细介绍了SIMD的概念、编程方法,并讨论了WASM对SIMD的支持情况,包括Emscripten的编译限制。最后,通过示例展示了如何利用SIMD进行数组运算优化,并指出WASM SIMD在现代浏览器中的兼容性。

最低0.47元/天 解锁文章
1913

被折叠的 条评论
为什么被折叠?



