问题标签 [auto-vectorization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
37042 浏览

gcc - 如何使用 gcc 进行矢量化?

v4 系列编译器可以使用一些现代 CPU 上的SIMDgcc处理器自动矢量化循环,例如 AMD Athlon 或 Intel Pentium/Core 芯片。这是怎么做到的?

0 投票
8 回答
133568 浏览

vectorization - 什么是“矢量化”?

现在有好几次,我在 matlab、fortran 中遇到过这个术语……其他……但我从来没有找到解释它是什么意思,它有什么作用?所以我在这里问,什么是矢量化,例如,“循环被矢量化”是什么意思?

0 投票
3 回答
12686 浏览

gcc - 如何在使用 GCC 时禁用矢量化?

我正在使用以下命令编译我的代码:

有了这个,所有的优化都被启用了。

但我想在保持其他优化的同时禁用矢量化。

0 投票
1 回答
421 浏览

c# - 在 CLR C++ 库中使用 SIMD

C# 和 Visual Basic 以及 .NET CLR 是用于用户界面和业务线应用程序等的优秀开发环境。

但是,我一直在编写很多代码,它们的执行时间O(n^3): n > 1000比这要高,而且在几个地方。基本上,这些循环从一个大数组中读取,做一些数学运算并进行五六次测试,然后将结果写入第二个相同大小的数组。

其中大部分是从英特尔 Fortran 程序移植的代码,以便将它们带入 64 位世界。我注意到,如果没有对该代码进行任何自动矢量化,执行时间会慢得多。.NET 不支持使用目前销售的每个英特尔处理器上的 SIMD 操作。

由于函数已经以严格的算法编写,可以由熟练的程序员移植,我认为要求程序员将代码移植到 C++ CLR 库可能是一种方法。

  • 是否可以获得一个自动矢量化的 C++ 库,并且还提供一个 CLR 接口供 C#/VB 程序调用?
  • 如果没有,是否存在解决方法?COM 接口是一种这样的解决方法吗?
  • 如果是,它必须采取什么形式?
0 投票
3 回答
1577 浏览

c++ - 重叠数组的总和、自动矢量化和限制

Arstechnia 最近有一篇文章为什么某些编程语言比其他语言快。它比较了 Fortran 和 C 并提到了求和数组。在 Fortran 中,假设数组不重叠,以便进一步优化。在 C/C++ 中,指向同一类型的指针可能会重叠,因此通常不能使用这种优化。但是,在 C/C++ 中,可以使用restrictor__restrict关键字告诉编译器不要假设指针重叠。所以我开始研究这个关于自动矢量化的问题。

以下代码在 GCC 和 MSVC 中矢量化

我在有和没有重叠数组的情况下对此进行了测试,它得到了正确的结果。但是,我使用 SSE 手动对该循环进行矢量化的方式不能处理重叠数组。

接下来我尝试使用__restrict. 我假设由于编译器可以假设数组不重叠,因此它不会处理重叠数组,但 GCC 和 MSVC 即使使用__restrict.

为什么自动矢量化代码有和没有__restrict重叠数组得到正确的结果?.

这是我用来测试的完整代码:

输出(来自 MSVC)

编辑:

这是另一个插入版本,它产生更简单的代码

0 投票
1 回答
1519 浏览

gcc - 禁用 GCC 函数中特定循环的自动矢量化

我想关闭函数中特定循环的自动矢量化。我怎样才能用 GCC 做到这一点?我知道我可以为整个函数关闭自动矢量化,__attribute__((optimize("no-tree-vectorize")))但是我如何为函数中的单个循环执行此操作(使用 MSVC,我可以使用 add #pragma loop(no_vector))。

0 投票
1 回答
37 浏览

c - 为什么代码块没有被 VC2013 自动向量化

代码块来自 mozilla firefox 的 qcms transform_util.c

对于这个循环:

VC2013 将显示:

e:\mozilla\hg\nightly\mozilla-central\gfx\qcms\transform_util.c(490) : info C5002: “500”,未循环化

MSDN(http://msdn.microsoft.com/en-us/library/jj658585.aspx)显示:

但是上面的循环没有if/break/continue,不知道为什么不能向量化。

0 投票
2 回答
264 浏览

c - 用 SSE 指令理解向量化

我试图了解使用 SSE 指令进行矢量化是如何工作的。

这是实现矢量化的代码片段:

和我的编译命令:

这里是汇编代码的输出:

多年前我练习过汇编程序,我想知道寄存器 %rdi、%rax 和 %rsi 上面代表什么。

我知道 %xmm0 是 SIMD 寄存器,我们可以在其中存储 2 个双精度数(16 个字节)。

但我不明白如何同时添加:

我认为一切都发生在这里:

%rax 是否代表“x”数组?

%rsi 在 C 代码片段中代表什么?

最终结果(例如 a[0]=a[0]+b[0] 是否存储到 %rdi 中?

谢谢你的帮助

0 投票
2 回答
867 浏览

c++ - 如何优化我的 AVX 代码

我尝试将以下代码转换为 AVX 内在函数以提高性能:

并尝试了以下方式:

但是性能很差。它甚至比英特尔编译器生成的自动矢量化代码还要慢。我尝试了以下事情:

  • 所有数据数组都是 64 字节对齐的__declspec(align(64))
  • 最后的商店被流媒体商店取代_mm256_stream_pd

当我查看创建的汇编代码时,我看到自动代码每次迭代都会获取所有参数(而不是像我所做的那样,仅在它们所属的循环中)。它还包含更多的算术运算。最后一点,最后的商店只需要我一半的时间(我重复代码片段 1000000 次),我看不出有什么理由。(我使用 Intel VTune Amplifier 来查看组装和花费的时间。)

提前感谢所有帮助!

0 投票
2 回答
575 浏览

c - GCC 自动矢量化对运行时没有影响,即使在所谓“有利可图”的情况下也是如此

在过去的几天里,我一直在阅读有关 gcc 4.7 的自动矢量化的信息。我按照我在网上看到的一些例子,设置似乎是正确的。但是当我实际使用代码运行并比较矢量化打开或关闭时,运行时没有明显差异。

这是我一直在使用的代码:

其中一些东西对我来说似乎是多余的,但对于让编译器了解正在发生的事情是必要的(尤其是数据对齐的事实)。从命令行读取的“b”变量就在那里,因为我对编译器完全优化循环感到偏执。

这是启用矢量化时的编译器命令:

基本上,这相当于只使用 -O3。我把标志放在自己身上,所以我需要做的就是删除“ftree-vectorize”并能够在没有矢量化的情况下测试结果。

这是 ftree-vectorize-verbose 标志的输出,以表明代码实际上正在被矢量化:

请注意,矢量化在 3 次迭代后是有利可图的,并且我正在运行 2^29~=500,000,000 次迭代。所以我应该期待一个完全不同的运行时关闭矢量化,对吧?

好吧,这里是代码的运行时间(我连续运行了 20 次):

扔掉那个奇怪的约 370 秒的异常值,平均运行时间为 58.7 秒,标准差为 6.0 秒。

接下来,我将使用与之前相同的命令进行编译,但没有 -ftree-vectorize 标志:

再次连续运行程序 20 次会产生以下时间:

再次丢弃异常值,这给出了 57.9 秒的平均运行时间,标准偏差为 3.6 秒。

所以这两个版本的运行时间在统计上是无法区分的。

谁能指出我做错了什么?编译器吐出的“盈利门槛”不是我想的意思吗?我非常感谢人们能给我的任何帮助,过去一周我一直在努力解决这个问题。

编辑

我实施了@nilspipenbrinck 建议的更改,并且似乎奏效了。我将矢量化循环卡在一个函数中,并多次调用该函数。相对运行时间现在为 24.0 秒(sigma 为 <0.1 秒),无矢量化相对于 20.8 秒(sigma < 0.2 秒)矢量化,或 13% 的速度提升。没有我希望的那么多,但至少现在我知道它的工作原理了!感谢您花时间查看我的问题并写下答案,我真的很感激。