は、次のコードを確認してください:なぜ "#pragma omp simd"はgccコンパイラで "-O2"のパフォーマンスが大幅に向上するのですか?
#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
"は大きなパフォーマンスを得ることはできません。 "#pragma omp simd
"と
$ gcc -O2 -fopenmp parallel.c
$ ./a.out
Work consumed 0.446662 seconds
::私は-O2
オプション、ノー" #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命令を利用する可能性が高いように見えます。結果のアセンブリを比較しましたか? – Harald