深入拆解java虚拟机完结文章向量化_第1页
深入拆解java虚拟机完结文章向量化_第2页
深入拆解java虚拟机完结文章向量化_第3页
深入拆解java虚拟机完结文章向量化_第4页
深入拆解java虚拟机完结文章向量化_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

由于数组元素在内存中是连续的,当从src[i]的内存地址处32位的内容时,一src[i]至src[i+3]的值。同样,当向dst[i]的内存地址处写入32位的内容时,一并写通过综合这两个批量操作,我们可以使用一条内存指令以及一条内存写入指令,完成上面代码中循环体内的全部工作。如果我们用]来指代]至]voidvoidfoo(byte[]dst,byte[]src)for(inti=0;i<dst.length-4;i+={dst[i:i+3]=}...//post-}SIMD指byte4int组,或者long数组,那么四个数组元素并起来将会是16字节或32字节。我们知道,X86_6464位(即8),无法暂存这些超长的数据。因此,即时编译器将借助长度足够的XMM寄存器,来完成int数组与long数组的向量化和写入操作。(为了实现方便,byte数组的向量化、写入操作同样使用了XMM寄存器。XMMSSE(StreamingSIMDExtensions)指令集所引入的。它们一开始仅为128位。自从X86平台上的CPU开始支持AVX(AdvancedVectorExtensions)指令集后(2011),XMM256YMMXMM寄存器的指令,现将使用YMM寄存器的低128位。前几年推出的AVX512指令集,更是将YMM寄存器升级至512位,并更名为ZMM寄存器。支持AVX512指令集的CPU都比较贵,目前在生产环境中很少见到。SSE指令集以及之后的AVX指令集都涉及了一个重要的概念,那便是单指令流多数据流(Single之为SIMD指令。SIMDXMM(YMMZMM)中的值看成多个整数或者浮点数组举例来说,128XMM16byte8short成的向量,4个int值组成的向量,两个long值组成的向量;而SIMD指令PADDB、PADDW、PADDD以及PADDQ,将分别实现byte值、short值、int值或者long值的向量加法。voidvoidfoo(int[]a,int[]b,int[]{for(inti=0;i<c.length;{c[i]=a[i]+}}上面这码经过向量化优化之后,将使用PADDD指令来实现c[i:i+3]=a[i:i+3]+b[i:i+3]。其执行过程中的数据流如下图所示,源自VladimirIvanov的[1]。下图中内成。因此,SIMD指令也被看成CPU指令级别的并行。使用SIMD指令的HotSpot可能不同。一般来说,越新的SIMD指令,它所支持的寄存器长度越大,功能也越强。X86_64CPUSSEAVX前量产的CPU支持AVX2指令集,最近少数服务器端CPU支持AVX512指令集。AVX512指令集的提升巨大,因为它不仅将寄存器长度增大至512字节,而且引入了非常多的新指令。上,并在编译过程中选择所支持的SIMD指令中的那些行过程中,程序将根据CPU所支持的指令集,来选择执行哪一个版本。如果不执行到这些不支持的指令,CPU会触发一个中断,并向当前进程发出sigill信号Java我们知道,JavaJavaJava,Java经运行在目标CPU之上,可以轻易地得知其所支持的指令集。接使用由In提供的,将被替换为具体SIMD指令的intrinsic方法[2]。HotSpotJavaintrinsicintrinsicSIMD指令复杂得多。在运行过程中,HotSpot虚拟机将根据当前体系架构来决定是否将对该intrinsic方法的调用替换为另一高效的实现。如果不,则使用原本的Java实现。举个例子,Java8Arrays.equals(intint[])intpublicpublicstaticbooleanequals(int[]a,int[]{ifreturnif(a==null||returnintlength=a.length;if(a2.length!=length)return//关键循forfor(inti=0;i<length;i++)if(a[i]!=a2[i])returnreturn不过,由于开发成本及成本较高,这种类型的intrinsic屈指可数,如用于数组的System.arraycopy和Arrays.copyOf,用于比较数组的Arrays.equals,以及Java9新加入 Arrays.copyOf将调用System.arraycopyintrinsicJava9数组比较真正的intrinsic是ArraySupports.vectorizedMismatch方法,而 自量voidvoidfoo(int[]a,int[]b,int[]{for(inti=0;i<c.length;{c[i]=a[i]+}}1longC2循环迭代之间最好不要有数据依赖,例如出现类似于a[ia[i-1]的语句。当循环展开之后,循环体内存在数据依赖,那么C2无法进行自量化。不要手工进行循环展开。如果C2无法自动展开,那么它也将无法进行自量化我们可以看到,自量化的条件较为苛刻。而且,C2支持的整数向量化操作并不多,据我所致只有向量加法,向量减法,按位与、或、异或,以及批量移位和批量乘法。C2向量化,即两两相乘再求和,不过这需要多条SIMD指令才能完成,因此并不是十分高效。为了解决向量化intrinsic以及自量化覆盖面过窄的问题,我们在OpenJDK的Paname项APIJavaIntVector<S256Bits>符合当前体系架构/CPU的SIMD指令。如果你感的话,可以参考VladimirIvanov今年在JVMLS上的[4]。总结与实CPUSIMDCPUHotSpotHotSpotintrinsic,在调用特定方法的时候替换为使用了SIMD指令的高效实现。Intrinsic属于点覆盖,只有当应用程序明确需要这些intrinsic的语义,才能够获得由它带来的性能提升。在支持256YMM寄存器的机器上,C2每个循环的次数。如果超过一定值,C2256YMM128位XMM寄存器的指令而言,单指令能处理的数据翻了一倍。Java9(Java8128XMM//Run//java mand='dontinlineVectorizationTest.foo' mand='printVectorizapublicclassVectorizationTest{staticvoidfoo(int[]a,int[]b,int[]{for(inti=0;i<a.length;i++){c[i]=a[i]+b[i];}}publicstaticvoidmain(String[]args)throws{int[]a=newint[]{1,2,3,4,5,6,7,8,1,2,3,4,5,6,8int[]c=newfor(inti=0;i<20_000;{foo(a,a,}}}ce7c650:vmovdquxmm0,XMMWORDPTRce7c656:vpadddxmm0,xmm0,XMMWORDPTRce7c65c:vmovdquXMMWORDPTRint[]a=newint[]{1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,int[]c=newff04d9c:vmovdquymm0,YMMWORDPTRff04da2:vpadddymm0,ymm0,YMMWORDPTRff04da8:vmovdquYMMWORDPTR--staticstaticvoidfoo(int[]a)for(inti=4;i<a.length;{a[i]=a[i-}}[1]VectorizationinHotSpot[2] JVMLSJVMLS归科技所有 精选留言 小结一下1:向量化优化-本质是多干一些活,免得来回折腾费时费力,通过减少来回折腾的工作量来提高性能。他是怎么实现的呢?他是借助CPU的SIMD指令,通过单条指令控制多组数据的运算,实现了CPU指令级别的并行。2:使用向量化优化是有一些前提条件的,目前HotSpot虚拟机运用向量化优化的方式有两种。第一种使用HotSpotntrnsic,在调用特定的方法的时候替换为使用了SIMD指令的高效实现。第二种是依赖即时编译器进行的自量化,自量化也有苛刻的使用前提条件。圆滚 D好棒哦!学到很多 D之前用过TI的DSP,里边有很多支持向量处理的计算指令,比如复数乘法,共轭相乘等,但是这些计算指令器不多,而且不能在一个指令周期

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论