PARALLEL.RU

Дискуссионный клуб по параллельным вычислениям
Текущее время: 11 дек 17 7:15

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: OpenMP и reduction
СообщениеДобавлено: 8 июн 11 20:20 
Не в сети

Зарегистрирован: 8 июн 11 19:31
Сообщения: 2
Есть простой код написанный с использованием 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 одно ядро.

Помогите пожалуйста разобраться.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: OpenMP и reduction
СообщениеДобавлено: 8 июн 11 21:51 
Не в сети

Зарегистрирован: 8 июн 11 19:31
Сообщения: 2
Выяснил в чем "проблема". Оказывается я неправильно замерял время. С помощью clock() нельзя замерять время работы параллельной программы, т.к. она использует 2 ядра. Здесь мне дали подробное объяснение http://stackoverflow.com/questions/6281 ... -reduction.
Нужно использовать omp_get_wtime()


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB