如何在gcc中使用矢量化选项
如何在gcc中使用矢量化选项,c,gcc,optimization,vector,vectorization,C,Gcc,Optimization,Vector,Vectorization,Linux 3.13.0-68-generic x86\u 64 Ubuntu 14.04.3 gcc(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4 我有一个简单的程序,我想实际使用矢量 #include <stdio.h> #include <sys/time.h> struct timeval stop, start; int main() { int i; int x[8192], y[8192]; int a =
Linux 3.13.0-68-generic x86\u 64 Ubuntu 14.04.3 gcc(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4
我有一个简单的程序,我想实际使用矢量
#include <stdio.h>
#include <sys/time.h>
struct timeval stop, start;
int main() {
int i;
int x[8192], y[8192];
int a = 1, b = 2, c = 3;
gettimeofday(&start, NULL);
for (i = 0; i < 8192; i++) {
y[i] = a * x[i] * x[i] + b * x[i] + c;
}
gettimeofday(&stop, NULL);
printf("%d us\n", stop.tv_usec - start.tv_usec);
for (i = 0; i < 8192; i++) {
printf("%d\r", y[i]);
}
return 0;
}
#包括
#包括
结构timeval停止、启动;
int main(){
int i;
int x[8192],y[8192];
INTA=1,b=2,c=3;
gettimeofday(&start,NULL);
对于(i=0;i<8192;i++){
y[i]=a*x[i]*x[i]+b*x[i]+c;
}
gettimeofday(&stop,NULL);
printf(“%d us\n”,stop.tv\u usec-start.tv\u usec);
对于(i=0;i<8192;i++){
printf(“%d\r”,y[i]);
}
返回0;
}
如果我使用
-O0
时间是30美元
-O1
时间是3US
-O2
时间为1或0 us
但是如果我使用
-finline函数-funswitch循环-fpredictive commoning-重新加载后的fgcse-ftree循环分布模式-ftree slp矢量化-fvect成本模型-ftree部分预fipa cp克隆-ftree矢量化
这些都是我能找到的矢量化选项,但时间消耗与-O0
我应该使用哪个选项?
gcc-O2-ftree-vectorize-ftree-vectorizer verbose=1 main.c
以下是输出:
main.c: In function ‘main’:
main.c:19:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__suseconds_t’ [-Wformat=]
printf("%d us\n", stop.tv_usec - start.tv_usec);
^
Analyzing loop at main.c:21
Analyzing loop at main.c:13
Vectorizing loop at main.c:13
main.c:13: note: LOOP VECTORIZED.
main.c:5: note: vectorized 1 loops in function.
-O3
启用矢量化和一些其他选项。您的一系列其他选项可能不会产生预期效果,因为您没有与它们一起指定优化级别。此外,您的程序包含未定义的行为,编译器可能根本不执行任何优化。如果我是你,我会尝试设计一个更好的测试用例。请注意,你的程序根本不使用循环的结果,因此它是一个无用的基准测试,因为编译器只是一起消除循环,只执行2个gettimeofday调用和一个printf。您可以使用gcc-S
生成汇编代码,并查看各种优化级别/标志的情况。不要只发布链接。网站规则要求将问题中的所有相关部分作为文本(而不是图像)发布。@Olaf I修改了它。