OpenMP медленное сокращение - PullRequest
1 голос
/ 08 июня 2011

Я пишу простой код 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 и не буду иметь ускорения. Я не понимаю, почему сокращение происходит медленно.

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Функция clock() измеряет время процессора, затрачиваемое на весь процесс, поэтому напечатанное время показывает сумму времени, затраченного всеми потоками. Если вы хотите видеть настенное время (в реальном времени, прошедшее с начала до конца), используйте, например, times () функция в системе POSIX

1 голос
/ 08 июня 2011

То, что вы делаете, настолько просто, что вы, вероятно, ограничены пропускной способностью памяти. Я редко получаю ускорения, пока работа не станет намного больше, чем время, необходимое для получения данных с работы. Плюс сокращение имеет дополнительную работу по слиянию всех промежуточных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...