【问题标题】:g++ autovectorization fail for the most basic exampleg ++自动向量化对于最基本的示例失败
【发布时间】:2013-01-03 23:10:29
【问题描述】:

我目前正在尝试将自动矢量化与 g++ 一起使用。 为此,我使用以下最小示例:

#include <array>
int main()
{
    std::array<double, 16> x;
    for (unsigned int i = 0; i < 16; i++) x[i] = i;
    return x[15];
}

我编译:

g++-4.7 -Wall -Wextra -std=c++11 -O3 -ftree-vectorizer-verbose=9 tests.cpp -o tests

结果是:

Analyzing loop at tests.cpp:5

5: ===== analyze_loop_nest =====
5: === vect_analyze_loop_form ===
5: === get_loop_niters ===
5: ==> get_loop_niters:16
5: === vect_analyze_data_refs ===

5: not vectorized: no vectype for stmt: MEM[(value_type &)&x]._M_instance[i_21] = D.21296_5;
 scalar_type: value_type
5: bad data references.
tests.cpp:2: note: vectorized 0 loops in function.

问题是什么以及如何解决?

编辑: 结果是一样的:

#include <array>
int main()
{
    std::array<int, 16> x;
    for (int i = 0; i < 16; i++) x[i] = i;
    return x[15];
}

【问题讨论】:

  • x[i] = i 真的是可以向量化的东西吗?也许你应该尝试一下x[i] = a[i] + b[i]
  • g++ 4.7.2 为我成功地矢量化了循环。您看过生成的程序集输出了吗?
  • 整个函数看起来应该优化到return 15;,而不需要任何矢量化。
  • 您的确切平台/编译器组合是什么?对于 x86-64 下的 g++4.7.2,似乎矢量化就好了

标签: c++ c++11 g++ compiler-optimization vectorization


【解决方案1】:

检查你的编译标志no vectype for stmt 意味着你的架构不支持这些指令。

设置-march=native-march=corei7

【讨论】:

  • 适用于-march=corei7。注意:我在 VirtualBox 下(主机:Win7 x64,访客:Ubuntu 12.04 with g++4.7.1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
  • 2017-08-15
相关资源
最近更新 更多