Gcc 自动矢量化的实际应用?

Gcc 自动矢量化的实际应用?,gcc,loops,simd,vector-processing,Gcc,Loops,Simd,Vector Processing,有没有人利用了gcc可以实现的自动矢量化?在现实世界中(与示例代码相反)?它是否需要对现有代码进行重组来利用?在任何生产代码中,是否有大量的情况可以通过这种方式进行矢量化?在任何业务逻辑中都很难使用它,但当您以同样的方式处理大量数据时,它可以提高速度 声音/视频处理就是一个很好的例子,您可以对每个采样/像素应用相同的操作。 我使用了VisualDSP,编译后您必须检查结果-如果它真的在应该使用的地方使用。矢量化主要用于数值程序。矢量化程序可以在矢量处理器上运行得更快,如PS3游戏控制台中使用的S

有没有人利用了gcc可以实现的自动矢量化?在现实世界中(与示例代码相反)?它是否需要对现有代码进行重组来利用?在任何生产代码中,是否有大量的情况可以通过这种方式进行矢量化?

在任何业务逻辑中都很难使用它,但当您以同样的方式处理大量数据时,它可以提高速度

声音/视频处理就是一个很好的例子,您可以对每个采样/像素应用相同的操作。
我使用了VisualDSP,编译后您必须检查结果-如果它真的在应该使用的地方使用。

矢量化主要用于数值程序。矢量化程序可以在矢量处理器上运行得更快,如PS3游戏控制台中使用的STI Cell处理器。例如,在那里,用于绘制游戏图形的数值计算可以通过矢量化大大加快。这种处理器称为SIMD(单指令多数据)处理器

在其他处理器上不使用矢量化。矢量化程序在不适用于非SIMD处理器的矢量化指令集上运行


英特尔Nehalem系列处理器(2008年底发布)实现SSE 4.2指令,即SIMD指令。来源:.

矢量化指令不限于单元处理器-大多数现代工作站(如CPU)都有它们(PPC、自奔腾3以来的x86、Sparc等)。如果能很好地用于浮点运算,它对计算密集型任务(过滤器等)会有很大帮助。在我的经验中,自动矢量化效果不太好。

< P>我还没有看到GCC或英特尔C++自动地对任何东西进行矢量化,但是非常简单的循环,即使在给定算法(可以在我用SSE内含物手工重写它们之后)的代码被矢量化时。 这其中的一部分是保守的——特别是当面临可能的指针别名时,C/C++编译器很难向自己“证明”向量化是安全的,即使您作为程序员知道它是安全的。大多数编译器(明智地)宁愿不优化代码,也不愿冒出错的风险。这是一个高级语言比C语言具有真正优势的领域,至少在理论上是这样(我说是在理论上,因为我实际上不知道有任何自动向量化的ML或Haskell编译器)

它的另一部分只是分析局限性——据我所知,矢量化的大多数研究都与优化经典数值问题(比如流体动力学)有关,这在几年前是大多数矢量机的主要任务(在CUDA/OpenCL、Altivec/SSE和STI单元之间,各种形式的矢量编程在商业系统中变得广泛可用)


对于编译器来说,为标量处理器编写的代码不太可能容易进行矢量化。令人高兴的是,您可以做很多事情使编译器更容易理解如何对其进行矢量化,例如循环平铺和部分循环展开(也倾向于)即使编译器不知道如何对其进行矢量化,也能提高现代处理器的性能。

您可能已经注意到,实际上几乎没有人知道如何充分利用GCC的自动矢量化。如果您在web上搜索以查看人们的评论,您总会想到GCC允许您启用自动矢量化但是它很少实际使用它,因此如果您想使用SIMD加速(例如:MMX、SSE、AVX、NEON、AltiVec),那么您基本上必须知道如何使用编译器内部函数或汇编语言代码来编写它

但内部语言的问题是,您需要有效地理解它的汇编语言方面,然后还要学习描述所需内容的内部语言方法,这可能会导致代码的效率比用汇编代码编写的代码低很多(例如10倍),因为编译器仍然无法很好地利用您的内在指令

例如,您可能正在使用SIMD intrinsic,以便可以同时并行执行许多操作,但您的编译器可能会生成汇编代码,在SIMD寄存器和普通CPU寄存器之间传输数据,然后再传输回来,从而有效地使SIMD代码以类似的速度运行(甚至更慢)比普通代码

所以基本上:

  • 如果您想要高达100%的加速(2倍 速度),然后购买 英特尔/ARM官方编译器或将部分代码转换为使用SIMD C/C++内部函数
  • 如果你 想要1000%的加速(10倍的速度),那么 使用SIMD指令手工编写汇编代码。或者,如果硬件上有GPU加速,请使用OpenCL或Nvidia的CUDA SDK,因为它们可以在GPU中提供与SIMD在CPU中类似的加速

@Amit,当今许多现代CPU都配备了向量处理器。这些向量处理器可以通过特殊指令访问。有时,GCC可以在给定适当的标志和明显有限的向量化代码集时发出这些指令。自奔腾MMX以来的x86,以及AMD的带有3DNow的K6-2。比P3早得多。