Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 矢量化在GCC中失败_C++_C_Gcc_Vectorization_Icc - Fatal编程技术网

C++ 矢量化在GCC中失败

C++ 矢量化在GCC中失败,c++,c,gcc,vectorization,icc,C++,C,Gcc,Vectorization,Icc,我试图理解矢量化,但令我惊讶的是,这个非常简单的代码没有被矢量化 #define n 1024 int main () { int i, a[n], b[n], c[n]; for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; } for(i=0; i<n; i++) c[i] = a[i]+b[i]; } 有了GCC,我似乎什么都得不到 > gcc -ftree-vectorize -ftree-vectorizer-verbo

我试图理解矢量化,但令我惊讶的是,这个非常简单的代码没有被矢量化

#define n 1024
int main () {
  int i, a[n], b[n], c[n];

  for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
  for(i=0; i<n; i++) c[i] = a[i]+b[i];
}
有了GCC,我似乎什么都得不到

> gcc -ftree-vectorize -ftree-vectorizer-verbose=2 a.c
我做错什么了吗?这不是一个非常简单的向量化循环吗?所有相同的操作、连续内存等。我的CPU支持SSE1/2/3/4

---更新---

根据下面的答案,这个例子对我很有用

#include <stdio.h>
#define n 1024

int main () {
  int i, a[n], b[n], c[n];

  for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
  for(i=0; i<n; i++) c[i] = a[i]+b[i];

  printf("%d\n", c[1023]);  
}
和海湾合作委员会

> gcc -ftree-vectorize -fopt-info-vec -O a.c
a.c:8:3: note: loop vectorized
a.c:7:3: note: loop vectorized

我稍微修改了您的源代码,以确保GCC无法删除循环:

#include <stdio.h>
#define n 1024

int main () {
  int i, a[n], b[n], c[n];

  for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
  for(i=0; i<n; i++) c[i] = a[i]+b[i];

  printf("%d\n", c[1023]);  
}
我得到:

分析交流回路:8

交流矢量化回路:8

a、 c:8注:循环矢量化。分析交流回路:7

交流矢量化回路:7

a、 c:7注:循环矢量化。a、 c:注意:矢量化的2个循环 功能

使用
-fdump tree vect
开关GCC将在
a.c.##t.vect
文件中转储更多信息(了解“内部”发生的情况非常有用)

也考虑:

  • -march=
    开关对于执行矢量化非常重要
  • -ftree向量器verbose=n
    现在被弃用,取而代之的是
    -fopt info-vec
    (请参阅)

大多数情况下,如果可以在处理器上使用,则选项
-Ofast-march=native
将对代码进行矢量化

$gcc compute\u simple.c-Ofast-march=native-fopt info vec-o compute\u simple.bin
compute_simple.c:14:5:注意:循环矢量化
compute_simple.c:14:5:注意:由于可能存在别名,因此对循环版本进行了矢量化
compute_simple.c:14:5:注意:循环矢量化
要知道您的处理器是否能做到这一点,请使用
lscpu
并查看可用标志

$lscpu
架构:x86_64
CPU操作模式:32位、64位
字节顺序:小端
中央处理器:12
...
供应商ID:GenuineIntel
...
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge
mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe系统调用
nx pdpe1gb rdtscp lm常数\u tsc艺术拱门\u性能pebs基站代表\u良好nopl
X拓扑不间断tsc cpuid aperfmperf tsc已知频率pni pclmulqdq dtes64
监视器ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1
sse4\u 2 x2apic movbe popcnt tsc\u截止时间\u计时器aes xsave avx f16c rdrand
lahf\u lm abm 3DNOW预取cpuid\u故障epb invpcid\u单个pti ssbd ibrs ibpb
stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1
hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt英特尔公司
xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_通知
hwp_act_窗口hwp_epp md_clear flush_l1d
英特尔需要sse/avx,ARM需要neon,AMD需要其他(比如xop)

通过搜索
gcc
文档,您可以找到更多有关矢量化的信息

这是一篇关于这个主题的好文章,其中的标志可用于许多平台:


最后,如上所述,在gcc的旧版本中使用
-ftree向量器verbose=n
,在最近的版本中,
-fopt info-vec
可以查看向量化的内容。

或者GCC只是将其全部删除。使用-O3选项到GCC可以获得更多信息。您应该从程序外部传入
n
,以确保优化器不只是计算最终结果并删除循环。这看起来很神奇,但它可以工作。我必须(首先)添加PrtTf,我想编译器不会认为它是无用的变量。然后我将-O和-fopt info-vec添加到编译器选项中。我的编译器(GCC4.9.0)没有显示-ftree向量器verbose=的任何内容。如果将-O替换为手册页中的所有选项,则不会执行任何操作!请注意,编译器仍然可以删除您的循环,因为它可以在编译期间运行循环,替换结果。
> gcc -ftree-vectorize -fopt-info-vec -O a.c
a.c:8:3: note: loop vectorized
a.c:7:3: note: loop vectorized
#include <stdio.h>
#define n 1024

int main () {
  int i, a[n], b[n], c[n];

  for(i=0; i<n; i++) { a[i] = i; b[i] = i*i; }
  for(i=0; i<n; i++) c[i] = a[i]+b[i];

  printf("%d\n", c[1023]);  
}
gcc -ftree-vectorize -ftree-vectorizer-verbose=1 -O2 a.c