【发布时间】:2014-05-05 20:19:15
【问题描述】:
我试图理解矢量化,但令我惊讶的是,这个非常简单的代码没有被矢量化
#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];
}
虽然英特尔编译器出于某种原因对初始化循环进行矢量化,但第 5 行。
> icc -vec-report a.c
a.c(5): (col. 3) remark: LOOP WAS VECTORIZED
使用 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]);
}
用icc
> icc -vec-report a.c
a.c(7): (col. 3) remark: LOOP WAS VECTORIZED
a.c(8): (col. 3) remark: LOOP WAS VECTORIZED
和 gcc
> gcc -ftree-vectorize -fopt-info-vec -O a.c
a.c:8:3: note: loop vectorized
a.c:7:3: note: loop vectorized
【问题讨论】:
-
或者 GCC 可能只是将其全部删除。
-
使用 gcc 的 -O3 选项来获取更多信息。
-
您应该从程序外部传入
n,以确保优化器不只是计算最终结果并删除循环。
标签: c++ c gcc vectorization icc