我正在尝试理解向量化,但令我惊讶的是这个非常简单的代码没有被向量化
#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
n
,以确保优化器不仅计算最终结果并删除循环。 - Zan Lynx