2015-02-08 7 views
4

Моя программа на C++ занимает около 300 секунд для запуска. Внутри моей программы мне нужно разделить мои векторы. Анализатор VS говорит, что это занимает около 15% времени работы. вот код:с использованием #pragma omp parallel для медленной работы программы

template <class T> myVector<T> cWisDivide(myVector<T> &vec1, 

myVector<T> &vec2) 
{ 
    try 
    { 
     if (vec1._rows == vec2._rows) 
     { 
      myVector<T> result(vec1._rows); 
      //#pragma omp parallel for 
      for (int r = 1; r <= vec1._rows; r++) 
      { 
       if (vec2(r) != 0) 
       { 
        result(r) = vec1(r)/vec2(r); 
       } 
       else 
       { 
        throw std::runtime_error(""); 
       } 
      } 
      return result; 
     } 
    } 
    catch (const exception &e) 
    { 
     .... 
    } 
} 

Эта функция называется много раз. Если я использую #pragma ... перед циклом, использование процессора составляет 100% в течение примерно 350 секунд. что больше, чем время, затрачиваемое на последовательное выполнение программы.

Буду признателен, если кто-нибудь может помочь мне в этом вопросе.

+0

Насколько велик 'vec1._rows'? –

+0

'r' в цикле' for' должен быть определен до 'for'. Например: 'int r; #pragma .... for (r = 1 ...) ' –

+0

Попробуйте выполнить параллельную область дальше наружу. Если вы вызываете функции много раз, вы также платите за инициализацию каждый раз, когда вы ее вызываете. – Chiel

ответ

1

Это может пойти не так, в ряде способов:

  1. , не зная тип result, вполне возможно, что барьеры должны быть построены, чтобы избежать состояния гонки при изменении его - вы могли бы избежать этого с помощью параллельных векторов результатов, которые вы затем объедините.
  2. накладные расходы на копирование для vec1 и vec2 векторы могут быть больше, чем вознаграждение за производительность.

В целом, это вопрос о параллелизируемых типах векторов - обратитесь к своей документации по OpenMP по выбору, чтобы узнать больше о доступных для доступа типах.

0

Во всяком случае, я просто смотрел его вверх и от OMP спецификации ...

• Вбрасывания выполненного внутри области петли должен вызвать выполнение возобновить в пределах одной итерации области петли, а один и тот же поток, бросил исключение, должен поймать его.

Я знал, что мне не нравится внешний вид исключения.

OpenMP API V4.0 стр. 59.

Смежные вопросы