OpenMP на Intel i7 - PullRequest
       25

OpenMP на Intel i7

2 голосов
/ 27 августа 2009

У меня проблема с openMP в процессоре i7.

Я использовал openMP только для параллельного цикла for. Алгоритм использовался на нескольких разных ПК и работал без проблем. Недавно мы попытались запустить его в системе i7, и у нас возникла проблема. Программное обеспечение обычно работает в течение некоторого времени, и после нескольких циклов оно сообщило «недостаточно памяти», и мы попытались обнаружить утечку памяти, но вместо этого мы обнаружили, что используемый размер стека программного обеспечения был слишком велик - было много потоков размером 1 МБ, закрыто. Каким-то образом потоки, созданные openMP, все застряли в стеке и память была заполнена ими.

Кто-нибудь испытывал когда-либо такое поведение? Код очень прост, просто "Прагма omp параллельно для" с некоторым циклом, который работает нормально на других ПК.

Я использую компилятор Microsoft Visual C ++ 9.0 со встроенной библиотекой openMP.

Спасибо Сергей

Ответы [ 4 ]

2 голосов
/ 01 сентября 2009

Спасибо за ответы. Я выяснил, что когда OpenMP запускает какой-либо параллельный цикл, он открывает несколько потоков, которые не останавливаются в конце, но повторно используются в другом параллельном цикле. В случае с i7 они не используются повторно, но всегда создаются новые для каждого параллельного цикла, поэтому стабильный рост стека составляет 1 МБ.

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

0 голосов
/ 14 июня 2012

Так как я не вижу ваш код, я попытаюсь угадать ...

Для меня это немного похоже на проблему с вложенными циклами при использовании #pragma omp for.

Если у вас есть вложенные циклы, вы должны установить переменные счетчика внутренних циклов как закрытые.

Взгляните на этот образец:

#pragma omp for private(j)
for(i=0; i<100; i++)
{
    for(j=0; j<10; j++)
    {
       A[i] = A[i] * 2;
    }
}

Переменная j имеет значение private, чтобы иметь ее экземпляр в каждом потоке, а не один и тот же экземпляр для всех потоков.

Проверьте это в своем коде, возможно, в этом проблема.

И (ваш компилятор должен вам это сказать) не используйте break; в ваших парализованных петлях. Это не сработает.

Удачи!

0 голосов
/ 31 августа 2009

Звучит скорее как проблема ОС, а не проблема приложения. Я предполагаю, что компилятор генерирует ту же сборку для того же кода. Если у вас есть какой-то старый процессор с гиперпоточностью, вы можете попробовать свой код, посмотрите, не возникает ли там такая же проблема.

0 голосов
/ 31 августа 2009

Вы можете попробовать использовать библиотеку Intel Thread Building Blocks (TBB), она очень похожа на OpenMP и действительно проще распараллелить цикл for, как вы описали, - чтобы увидеть, есть ли разница.

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