您当前的位置:首页 > 电脑百科 > 程序开发 > 前端

SIMD助力Photoshop迁移Web?浏览器为何沉迷SIMD?

时间:2023-02-09 15:32:18  来源:今日头条  作者:前端进阶

前言

WebAssembly SIMD以独立于平台的方式向 WebAssembly 应用程序公开硬件 SIMD 指令。 SIMD 提案引入了一种新的 128 位值类型,可用于表示不同类型的打包数据,以及几种对打包数据进行操作的向量运算。

SIMD 可以通过利用数据级并行性来提高性能,在将本机代码编译为 WebAssembly 时也很有用。

Chrome 91 默认开启了WebAssembly SIMD。

1.什么是SIMD?

SIMD (Single Instruction Multiple Data)代表单指令,多数据。 SIMD 指令是一类特殊的指令,它通过同时对多个数据元素执行相同的操作来充分利用数据并行性。 音、视频编解码器、图像处理器等计算密集型程序都是利用 SIMD 指令加速性能的典型场景。 大多数现代架构都支持 SIMD 指令的某些变体。

SIMD

WebAssembly SIMD 提议定义了一个可移植的、高性能的 SIMD 操作子集,可用于大多数现代架构。 该提案从 SIMD.js 提案中衍生出许多元素,而 SIMD.js 提案最初又是从 Dart SIMD 规范中衍生出来的。 SIMD.js 提案是在 TC39 上提出的一个 API,它具有用于执行 SIMD 计算的新类型和函数,但是为了在 WebAssembly 中更透明地支持 SIMD 操作,它被归档了。

WebAssembly SIMD 提议被引入作为浏览器使用底层硬件来处理数据并行性的方式。

2.为什么需要SIMD?

比如下面的例子,当需要对两个长度为4的数组做加法时,使用普通的指令,则需要执行4次普通加法指令。如果使用SIMD指令的话,则只需要执行1次向量加法即可。

为什么需要SIMD?图片引用于:https://developer.aliyun.com/article/860557

SIMD 常用于视频、音频、图像、加密、动画、游戏、AI等需要处理大量数据的应用场景,可以极大地提高向量类型的数据处理性能。主流的CPU都有SIMD指令,比如x86的SSE、ARM的Neon。

3.WebAssembly SIMD 提案核心内容?

WebAssembly SIMD 提案的最终目标是以保证可移植性能的方式将向量操作引入 WebAssembly 规范。

SIMD 指令集很大,并且在不同的体系结构中各不相同。 WebAssembly SIMD 提议中的操作集包括在各种平台上得到很好支持的操作,并且被证明是高性能的。 不过,目前的提案仅限于标准化 Fixed-Width 128 位 SIMD 操作。

当前的提议引入了一个新的 v128 值类型,以及一些对该类型进行操作的新操作。 用于确定这些操作的标准是:

  • 这些操作在多个现代架构中得到很好的支持
  • 在指令组内的多个相关架构中,应该有较好的性能
  • 所选的操作应该最小化性能降低(performance cliffs)

该提案现在处于最终确定状态(第 4 阶段),V8 和工具链都有可用的实现。目前,Emscripten仅支持将WebAssembly SIMD指令编译为x86 SSE/AVX指令以及ARM Neon指令。

WebAssembly SIMD指令编译。图片引用于:https://developer.aliyun.com/article/860557

4.启用 SIMD 支持

4.1 特征检测

首先,请注意 SIMD 是一项新功能,并非在所有支持 WebAssembly 的浏览器中都可用。具体浏览器支持情况可查看4.2小节的图。

为确保所有用户都可以加载您的应用程序,需要构建两个不同的版本 ,一个启用 SIMD,一个不启用 ,并根据功能检测结果加载相应的版本。 要在运行时检测 SIMD,您可以使用 wasm-feature-detect 库并加载相应的模块,如下所示:

brimport { simd } from 'wasm-feature-detect';br(async () => {br  const hasSIMD = await simd();br  // 等待返回br  const module = await (br    hasSIMDbr      ? import('./module-with-simd.js')br      : import('./module-without-simd.js')br  );br  //可以像平时一样使用 `module`br})();

如果是UMD格式可以通过:

br<script src="https://unpkg.com/wasm-feature-detect/dist/umd/index.js"></script>br<script>br  wasmFeatureDetect.simd().then(/* same as above */);br</script>

wasm-feature-detect本质上是一个小型库,用于检测支持哪些 WebAssembly 功能。

  • ✅ 所有浏览器都支持
  • ✅ Node环境中依然可用
  • ✅ 提供ES6 模块、CommonJS 和 UMD版本
  • ✅ CSP兼容
  • ✅ gzip压缩后~640B

4.2 浏览器中的 SIMD 支持

下图展示了Fixed-Width 128 位 SIMD的浏览器支持情况。

Fixed-Width 128 位 SIMD浏览器支持情况

如图所示,WebAssembly SIMD 支持默认从 Chrome 91 开始。确保使用最新版本的工具链,以及最新的 wasm-feature-detect 来检测支持最终版本规范的引擎。Firefox 89 及更高版本也支持 WebAssembly SIMD。

5.总结

本文只是告诉大家什么是SIMD,为什么WebAssembly需要引入SIMD?因为笔者不是这方面的专家,关于SIMD也就浅尝辄止。但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。其中值得一提的WebAssembly SIMD的典型示例:

  • google Meet借助WebAssembly实现了视频的实时背景虚化以及背景替代,利用WebAssembly SIMD使其性能提升了至少2倍。
  • 2021年,Photoshop迁移到了Web也是通过WebAssembly实现的,其中,WebAssembly SIMD发挥了重要的作用,将性能平均提升了3~4倍,有些场景下甚至达到惊人的80~120倍。

 

参考资料

https://chromestatus.com/feature/6533147810332672

https://v8.dev/features/simd

https://developer.aliyun.com/article/860557

https://Github.com/GoogleChromeLabs/wasm-feature-detect

https://github.com/WebAssembly/simd/blob/main/proposals/simd/SIMD.md



Tags:SIMD   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
SIMD助力Photoshop迁移Web?浏览器为何沉迷SIMD?
前言WebAssembly SIMD以独立于平台的方式向 WebAssembly 应用程序公开硬件 SIMD 指令。 SIMD 提案引入了一种新的 128 位值类型,可用于表示不同类型的打包数据,以及几种对打包...【详细内容】
2023-02-09  Search: SIMD  点击:(213)  评论:(0)  加入收藏
▌简易百科推荐
20k级别前端是怎么使用LocalStorage的,想知道吗?
当咱们把咱们想缓存的东西,存在localStorage、sessionStorage中,在开发过程中,确实有利于咱们的开发,咱们想看的时候也是一目了然,点击Application就可以看到。前言大家好,我是林...【详细内容】
2024-03-26  前端之神  微信公众号  Tags:前端   点击:(13)  评论:(0)  加入收藏
前端不存在了?盲测64%的人更喜欢GPT-4V的设计,杨笛一等团队新作
3 月 9 日央视的一档节目上,百度创始人、董事长兼 CEO 李彦宏指出,以后不会存在「程序员」这种职业了,因为只要会说话,人人都会具备程序员的能力。「未来的编程语言只会剩下两种...【详细内容】
2024-03-11  机器之心Pro    Tags:前端   点击:(16)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown &mdash;&mdash; 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  OSC开源社区    Tags:Vue   点击:(20)  评论:(0)  加入收藏
两年前端经验还不会手写Promise?
什么是promise?当我们处理异步操作时,我们经常需要进行一系列的操作,如请求数据、处理数据、渲染UI等。在过去,这些操作通常通过回调函数来处理,但是回调函数嵌套过多会导致代码...【详细内容】
2024-03-07  海燕技术栈  微信公众号  Tags:Promise   点击:(27)  评论:(0)  加入收藏
网站开发中的前端和后端开发有什么区别
前端开发和后端开发都是干什么的?有哪些区别?通俗地讲,前端干的工作是用户可以直接看得见的,而后端开发的工作主要在服务端,用户不太能直接看到。虽然前端开发和后端开发的工作有...【详细内容】
2024-02-21  CarryData    Tags:前端   点击:(35)  评论:(0)  加入收藏
网站程序开发中的前后端分离技术
随着互联网的快速发展和技术的不断创新,传统的网站开发模式已经难以满足日益增长的业务需求。为了提高开发效率、增强系统的可维护性和可扩展性,前后端分离技术逐渐成为了网站...【详细内容】
2024-01-31  网站建设派迪星航    Tags:前后端分离   点击:(26)  评论:(0)  加入收藏
如何优雅的实现前端国际化?
JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库!i18nexti18ne...【详细内容】
2024-01-17  前端充电宝  微信公众号  Tags:前端   点击:(76)  评论:(0)  加入收藏
Vue中Scope是怎么做样式隔离的?
scope样式隔离在 Vue 中,样式隔离是通过 scoped 特性实现的。当在一个组件的 <style> 标签上添加 scoped 特性时,Vue 会自动为这个样式块中的所有选择器添加一个唯一的属性,以...【详细内容】
2024-01-04  海燕技术栈  微信公众号  Tags:Vue   点击:(83)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  互联网高级架构师  今日头条  Tags:vue3   点击:(42)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  爱做梦的程序员  今日头条  Tags:Vue3   点击:(74)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条