Есть простой код написанный с использованием OpenMP, делающий редукцию массива. Проблема в том, что редукция выполняется медленнее, чем вариант простого суммирования безо всякого 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])); // более сложный вариант некой функции
sum += arr[i]; // простейшее суммирование
}
double diff = ( clock() - start ) / (double)CLOCKS_PER_SEC;
cout << "Time " << diff << "s" << endl;
cout << sum << endl;
delete[] arr;
return 0;
}
Компилировал при помощи:
icpc reduction.cpp -openmp -o reduction -O3
g++ reduction.cpp -fopenmp -o reduction -O3
Время выполнения варианта "sum += arr[i];":
icpc
0.1c без OpenMP
0.18c с OpenMP
g++
0.11c без OpenMP
0.17c с OpenMP
Время выполнения варианта "sum += sqrt(sqrt(arr[i] * arr[i]));":
icpc
2,92c без OpenMP
3,37c с OpenMP
g++
47,97c без OpenMP
48,2c с OpenMP
Процессор: Intel Core 2 Duo T5850.
OC: Ubuntu 10.10
Пробовал разное количество потоков. Думал, что слишком мало вычислений и попробовал для примеру вычислять более сложную функцию в теле цикла (которая закомментирована), но быстрее ничего не заработало. Причем по системному монитору видно, что при использовании OpenMP задействовано оба ядра процессора, а без OpenMP одно ядро.
Помогите пожалуйста разобраться.