【发布时间】:2018-06-07 23:08:18
【问题描述】:
检查以下代码:
#include <stdio.h>
#include <omp.h>
#define ARRAY_SIZE (1024)
float A[ARRAY_SIZE];
float B[ARRAY_SIZE];
float C[ARRAY_SIZE];
int main(void)
{
for (int i = 0; i < ARRAY_SIZE; i++)
{
A[i] = i * 2.3;
B[i] = i + 4.6;
}
double start = omp_get_wtime();
for (int loop = 0; loop < 1000000; loop++)
{
#pragma omp simd
for (int i = 0; i < ARRAY_SIZE; i++)
{
C[i] = A[i] * B[i];
}
}
double end = omp_get_wtime();
printf("Work consumed %f seconds\n", end - start);
return 0;
}
在我的机器上构建并运行它,它输出:
$ gcc -fopenmp parallel.c
$ ./a.out
Work consumed 2.084107 seconds
如果我注释掉“#pragma omp simd”,再次构建并运行它:
$ gcc -fopenmp parallel.c
$ ./a.out
Work consumed 2.112724 seconds
我们可以看到“#pragma omp simd”并没有获得很大的性能提升。但是如果我添加-O2 选项,则没有“#pragma omp simd”:
$ gcc -O2 -fopenmp parallel.c
$ ./a.out
Work consumed 0.446662 seconds
带“#pragma omp simd”:
$ gcc -O2 -fopenmp parallel.c
$ ./a.out
Work consumed 0.126799 seconds
我们可以看到很大的改进。但是如果使用-O3,则没有“#pragma omp simd”:
$ gcc -O3 -fopenmp parallel.c
$ ./a.out
Work consumed 0.127563 seconds
使用“#pragma omp simd”:
$ gcc -O3 -fopenmp parallel.c
$ ./a.out
Work consumed 0.126727 seconds
我们可以再次看到结果相似。
为什么“#pragma omp simd”在gcc编译器下只对-O2有很大的性能提升?
【问题讨论】:
-
看起来编译器在使用 O3 时会进一步优化您的代码,并且可能会利用 simd 指令。您是否比较了生成的程序集?
标签: performance gcc openmp simd auto-vectorization