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函数的配对 *** 作函数,关闭一个锁
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)