有人利用的自动矢量化,海湾合作委员会可以做什么?在现实世界中的(相对于例代码)?它不会采取的改组现有的代码中采取的优势?是否有一个显着的案件数量在任何产生的代码,可以量化这种方式?

有帮助吗?

解决方案

我还没有看到GCC或英特尔C ++自动向量化除了非常简单的循环之外的任何东西,即使给定的算法代码可以(并且在我使用SSE内在函数手动重写之后)被矢量化。

部分原因是保守 - 特别是当遇到可能的指针别名时,C / C ++编译器很难向自己“证明”矢量化是安全的,即使你是程序员知道的那样它是。大多数编译器(明智地)更喜欢不优化代码而不是冒错误编译的风险。这是高级语言比C更有优势的一个领域,至少在理论上是这样的(我在理论上说,因为我实际上并不知道任何自动向量化的ML或Haskell编译器)。

它的另一部分只是分析限制 - 我理解,大多数矢量化研究都与优化经典数值问题(流体动力学,比如说)相关,这是大多数矢量机器在几年前(当时)的面包和黄油。在CUDA / OpenCL,Altivec / SSE和STI Cell之间,各种形式的矢量编程在商业系统中得到广泛应用。)

编写标量处理器的代码很可能很容易被编译器进行矢量化。令人高兴的是,您可以做很多事情来使编译器更容易理解如何对其进行矢量化,例如循环平铺和部分循环展开,即使编译器没有弄清楚如何矢量化它。

其他提示

在任何业务逻辑中都很难使用,但在以相同方式处理大量数据时会加快速度。

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

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

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

英特尔的Nehalem系列处理器(2008年末发布)实施了SSE 4.2指令,这些指令是SIMD指令。资料来源:维基百科

矢量化指令不仅限于Cell处理器 - 大多数现代工作站 - 如CPU都有它们(PPC,x86自pentium 3,Sparc等......)。当用于浮点运算时,它可以为计算密集型任务(过滤器等)提供很多帮助。根据我的经验,自动矢量化效果不佳。

你可能已经注意到,几乎没有人真正知道如何很好地使用的海湾合作委员会的自动矢量化。如果你搜索网上看到人们的评论意见,但总是来到这个想法,海湾合作委员会可以让你能够自动矢量化,但是极少使得实际使用它,所以如果你想使用单指令加速度(例如:试试吧,上证,也可参考,霓虹灯,AltiVec),那么基本上你一定找出如何编写使用编译器内部函数或大会语言的代码。

但问题与内部函数是,你有效地需要了解大会的语言侧,然后还了解内部函数的方法的描述你想要什么,这很可能导致更有效的代码比如果你写了它在大会代码(如通过一个因素的10倍),因为这个编译器仍然要有麻烦使用好你的内在的指示!

例如,你可能会使用单指令内部函数如此,许多行动可平行进行的同时,编译器可能会产生大会的代码转让之间的数据单指令寄存器和常CPU登记和回,有效地制作你的单指令代码在运行一个类似的速度(或甚至速度较慢),比正常的代码!

所以基本上:

  • 如果你想高达100%的加速(2倍 速度),那么买的 官方的英特尔/臂编译器或转换一些你的代码可以使用单指令C/C++内部函数。
  • 如果你 想1000%的加速(10倍的速度),然后 把它写在大会代码使用单指令的指令。或者,如果提供硬件,使用GPU加速,而不是诸如usb类或更是CUDA SDK,因为他们可以提供类似的加速在GPU作为单指令并在CPU。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top