向量化的方法.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
向量化的方法

使用英特尔编译器进行自动向量化作者:?Yang Wang (Intel)?自动向量化是英特尔编译器提供的一个可以自动的使用SIMD指示的功能。在处理数据时,编译器自动选择MMX?, Intel? Streaming SIMD 扩展(Intel? SSE, SSE2, SSE3 和SSE4)等指令集,对数据进行并行的处理。使用编译器提供的自动向量化功能是提高程序性能的一个非常有效的手段。自动向量化在IA-32和Intel? 64的平台上均提供很好的支持。英特尔编译器提供的自动向量化相关的编译选项如下所示。”/Q”开头的选项是针对Windows平台的, “-“开头的选项是针对Linux*和Mac平台的。-x, /Qx按照该选项指定的处理器类型生成相应的优化代码。比如-xSSE3, 该选项指定编译器生成Intel? SSE3指令的代码。又比如-xSSE3_ATOM, 该选项针对Intel? Atom? 处理器进行优化。-ax, /Qax如果指定该选项,在生成的单一目标文件中,不但会生成专门针对指定的处理器类型进行优化的代码,同时也生成通用的IA-32架构的代码。该选项主要是为了生成代码的兼容性考虑。-vec, /Qvec打开或者关闭编译器的向量化优化。默认情况下自动向量化是打开的。-vec-report, /Qvec-report该选项用户控制在编译过程中产生的向量化消息报告。编译器提供的自动向量化优化默认情况下是打开的。在编译过程中我们可以使用-vec-report选项来打开向量化诊断消息报告。这样编译器可以告诉我们有哪些循环被向量化了,有哪些循环没有被向量化已经无法向量化的原因。在编译程序的过程中,有时候我们会发现编译器报告说某个循环无法被向量化。很多时候无法向量化的原因都是因为循环中存在的变量依赖关系。有时候我们可以修改程序来消除这种依赖关系,有的时候我们可以使用编译器提供的一些编译指示来显示的告诉编译器如何处理这种依赖关系。即使在某个循环已经可以被自动向量化的时候,使用编译器提供的对向量化的语言支持和编译指示还可以提高编译器向量化的效率,提高程序执行的性能。下面我们来详细解释一下编译器提供的编译指示以及这些指示对编译器编译的影响。在Intel编译器中,我们提供下面这样一些对自动向量化的语言支持和编译指示。__declspec(align(n))指导编译器将变量按照n字节对齐__declspec(align(n,off))指导编译器将变量按照n字节再加上off字节的编译量进行对齐restrict消除别名分析中的二义性__assume_aligned(a,n)当编译器无法获取对齐信息时,假定数组a已经按照n字节对齐#pragma ivdep提示编译器忽略可能存在的向量依赖关系#pragma vector {aligned|unaligned|always}指定向量化的方式#pragma novector指定不做向量化下面我们就这些编译指示做一些详细的了解。__declspec(align(n))首先我们来看看如何使用__declspec(align(n))来进行自动向量化。该指示主要是用来告诉编译器一个变量的对齐方式。当一个变量的对齐方式为16字节对齐时,生成的向量化指令是最高效的。当编译器不知道一个变量的对齐方式的时候,他可能没有办法对该变量的使用进行向量化,或者编译器会不得不生成条件语句来进行有条件的向量化。我们来看一下下面这个例子。File: vec1.cchar a[];void vec1(void){int i;for(i=0;i1024;i++)a[i] = 1;}使用下面命令编译该程序:icl vec1.c -O2 -c /Qvec-report:3这时编译器输出:vec1.cvec1.c(10) (col. 2): remark: LOOP WAS VECTORIZED.我们可以看到编译器对上面这个程序进行了自动向量化。但是实际上,由于编译器不知道a的对齐字节数,所以他对变量a数据进行了一些条件处理。我们可以在编译的时候加上-S选项来查看编译器生成的汇编代码。实际上,编译器对该程序做了如下处理:temp = a0x0f;if(temp != 0){temp = 16-temp;for(i=0;itemp;i++) a[i] = 1;}/*下面是对齐的访问*/for(i=temp;i1024;i++) a[i] = 1;如果我们指定了a的对齐方式,比如我们使用__declspec(align(16))来定义变量a, 如下所示:__declspec(align(16)) char a[];void vec1(void){int i;for(i=0;i1024;i++)a[i] = 1;}对于上面这段程序,编译器做了自

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档