Проверьте следующий код:
#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
» требует значительного улучшения производительности только в -O2
под компилятором gcc
?