javascript 怎么使用simd

javascript 怎么使用simd,第1张

SIMD(Single Instruction Multiple

Data))即单指令多数据流,它是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一个分别执行相同的 *** 作从而实现空间上的并行性的技术。该技术在图形处理、音频处理、编码、物理仿真、加密等领域中都得到了广泛应用,已成为现代CPU处理器最重要的功能设计,然而对于现代网页相当重要的JavaScript代码,却一直没有以处理器的SIMD指令集来提升性能。

目前SIMD.js主要支持具有SSE

的x86平台和具有NEON的ARM平台,而MIPS、Power等其他平台的支持还在考虑中。SIMD.js正快速演变为更通用的API。SIMD.js

API正处于活跃的开发之中,已经进行到草案阶段,且为其它阶段的准备工作也在进行中,正向最终API一步步靠近。另外,在支持Firefox

Nightly版本中SIMD.js正处于积极的开发之中,Internet Explorer已考虑加入SIMD.js。同时,在Chromium(Chrome浏览器的引擎)的分支中,也有一个原型的实现。在Firefox

Nightly版本中启用SIMD后的测试结果显示,JavaScript计算曼德尔布罗特集合的速度提升至4倍

未来,SIMD.js将会提供更广泛的功能,并提升更大范围应用的性能,尤其如游戏、视频、音频 *** 控、科学模拟等对性能要求比较高的应用。另外,Emscripten也将使用流行的SIMD来编译C++,以生成优化后的SIMD.js代码;长短SIMD风格的API将能够相互合作

Hack News上关于SIMD.js讨论已经有数百条,多数人肯定了开发SIMD.js提升JavaScript效率举措,还有人提出了新增对WebCL的支持的建议。有人认为把SIMD应用到一个编程语言中是不合适的,做了不该属于自己该做的事情,而最好的方式是使用增强类型接口和编译技术,并添加语言原语以帮助代码的生成。另外还指出曼德尔布罗特集合计算例子是一个通用的例子,不能充分证明SIMD.js对JavaScript加速效果。

x64

第一、cpu配套内存访问速度,这方面x86速度肯定更快。32位C编译器编译C函数时候调用使用内存栈传递参数,因为内存访问速度已经够快,再加上cpu高速缓存,运行速度能再上一个台阶。而ARM的ram是和CPU在一起的,更多考虑了功耗等问题。ram访问速度更慢,但作为补偿C程序函数的调用约定是在32位模式中用4个寄存器传递前4个32位参数数据,在64位模式中用8个寄存器传递前8个64位参数数据

第二、寄存器数量,这方面arm寄存器比x86寄存器更多,这对C程序的编译会更友好一些

第三、关于GPU,arm芯片都是和GPU一起的,为的是减少功耗,x86要看规格和厂商,比如笔记本芯片大多带集成GPU,而台式机可能就没有

第四、其他类似simd指令功能使用很不一样,相对来说arm规范很多,而x86的simd会更糟糕,x86的simd是16字节对齐,而arm的simd是4字节对齐。再比如:x86的simd整数乘法会增长数据长度,至少sse2指令集是如此的,而arm的乘法根据不同指令自己选择。

以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度,详细如下:

代码优化:

属性->配置属性->C/C++->代码生成:启用增强指令集,可选用 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2)、流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2) 进行加速浮点模型,可选用 快速 (/fp:fast) 进行浮点数据运算的加速

属性->配置属性->C/C++->优化:可选用 使速度最大化 (/O2) 进行优化。全程序优化选择是(/GL),在debug版本下不能这样设置,必须在release版本

openmp并行计算:

在vs2012下,项目属性-》C/C++-》语言,openmp支持,选是,包含头文件“omp.h”,对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。

OpenMP常用指令

parallel:用在一个代码段之前,表示这段代码将被多个线程并行执行

for:用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性

parallel for:parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行

sections:用在可能会被并行执行的代码段之前

parallel sections:parallel和sections两个语句的结合

critical:用在一段代码临界区之前

single:用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行

barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行

atomic:用于指定一块内存区域被制动更新

master:用于指定一段代码块由主线程执行

ordered:用于指定并行区域的循环按顺序执行

threadprivate:用于指定一个变量是线程私有的

OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数:

omp_get_num_procs:返回运行本线程的多处理机的处理器个数

omp_get_num_threads:返回当前并行区域中的活动线程个数

omp_get_thread_num:返回线程号

omp_set_num_threads:设置并行执行代码时的线程个数

omp_init_lock:初始化一个简单锁

omp_set_lock:上锁 *** 作

omp_unset_lock:解锁 *** 作,要和omp_set_lock函数配对使用

omp_destroy_lock:omp_init_lock函数的配对 *** 作函数,关闭一个锁


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11828877.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存