Я пишу простой код C ++, который вычисляет сумму сокращения массива, но с программой сокращения OpenMP работает медленно. Существует два варианта программы: один - самая простая сумма, другой - сумма сложной математической функции. В коде комментируется сложный вариант.
#include <iostream>
#include <omp.h>
#include <math.h>
using namespace std;
#define N 100000000
#define NUM_THREADS 4
int main() {
int *arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = i;
}
omp_set_num_threads(NUM_THREADS);
cout << NUM_THREADS << endl;
clock_t start = clock();
int sum = 0;
#pragma omp parallel for reduction(+:sum)
for (int i = 0; i < N; i++) {
// sum += sqrt(sqrt(arr[i] * arr[i])); // complex variant
sum += arr[i]; // simple variant
}
double diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
cout << "Time " << diff << "s" << endl;
cout << sum << endl;
delete[] arr;
return 0;
}
Я компилирую это ICPC и GCC:
icpc reduction.cpp -openmp -o reduction -O3
g++ reduction.cpp -fopenmp -o reduction -O3
Процессор: Intel Core 2 Duo T5850, ОС: Ubuntu 10.10
Есть время выполнения простых и сложных вариантов, скомпилированных с и без OpenMP.
Простой вариант "sum + = arr [i];":
icpc
0.1s without OpenMP
0.18s with OpenMP
g++
0.11c without OpenMP
0.17c with OpenMP
Сложный вариант "сумма + = sqrt (sqrt (arr [i] * arr [i]));":
icpc
2,92s without OpenMP
3,37s with OpenMP
g++
47,97s without OpenMP
48,2s with OpenMP
В системном мониторе я вижу, что 2 ядра работают в программе с OpenMP, а 1 ядро работает в программе без OpenMP. Я попробую несколько потоков в OpenMP и не буду иметь ускорения. Я не понимаю, почему сокращение происходит медленно.