OpenMP «медленнее» на iMac? (C ++) - PullRequest
0 голосов
/ 18 сентября 2010

У меня есть небольшая программа на C ++, использующая OpenMP. Он отлично работает на Windows7, Core i7 с VisualStudio 2010. На iMac с Core i7 и g ++ v4.2.1 код выполняется намного медленнее, используя 4 потока, чем один. Такое же «медленное» поведение демонстрируется на 2 других компьютерах Red Hat, использующих g ++. Вот код:

   int iHundredMillion = 100000000;
   int iNumWorkers = 4;
   std::vector<Worker*> workers;

   for(int i=0; i<iNumWorkers; ++i)
   {
      Worker * pWorker = new Worker();
      workers.push_back(pWorker);
   }

   int iThr;

   #pragma omp parallel for  private (iThr)     // Parallel run
   for(int k=0; k<iNumWorkers; ++k)
   {
      iThr = omp_get_thread_num();
      workers[k]->Run( (3)*iHundredMillion, iThr );
   }

Я компилирую с g ++ так:

g++ -fopenmp -O2 -o a.out *.cpp

Может кто-нибудь сказать мне, какую глупую ошибку я совершаю на платформе * nix?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Я думаю, что компилятор g ++ не оптимизирует так хорошо, как компилятор visual studio.Можете ли вы попробовать другие уровни оптимизации (например, -O3) и посмотреть, имеет ли это значение?

Или вы можете попробовать другой компилятор.Intel предлагает бесплатные компиляторы для Linux для некоммерческих целей.

http://software.intel.com/en-us/articles/non-commercial-software-development/

0 голосов
/ 18 сентября 2010

Невозможно ответить, учитывая предоставленную информацию, но можно предположить, что ваш код разработан так, что он не может быть эффективно выполнен в нескольких потоках.

Я мало работал с OMP,но я считаю, что разрешено использовать меньше рабочих потоков, чем указано.В этом случае некоторые реализации могут быть достаточно умными, чтобы понять, что код не может быть эффективно распараллелен, и просто запустить его в одном потоке, в то время как другие наивно пытаются запустить его на 4 ядрах и страдают от снижения производительности (из-заложный (или реальный) обмен, например)

Некоторая информация, которая понадобится для того, чтобы дать вам разумный ответ:

  • фактическое время (как долгокода требуется для запуска в одном потоке? Сколько времени с 4 потоками, использующими OM? Как долго с 4 потоками, использующими "обычные" потоки?
  • расположение данных: какие данные размещены, где и когда этодоступ?
  • что на самом деле происходит внутри цикла? Все, что мы можем видеть в данный момент, это умножение и вызов функции. Пока мы не знаем, что происходит внутри функции, вы могли бы также опубликоватьэтот код: foo(42) и спросил, почему он не возвращает ожидаемый результат.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...