Сложный цикл в программе C++, переносимой на OpenMP и MPI?

У меня есть программа для обработки чисел на С++. Структура:

а) ввод данных, подготовка данных

б) "большой" цикл, использует глобальные и локальные данные (много разных переменных в обоих случаях)

c) постобработка результатов и запись данных

Самая интенсивная часть — это «b», которая в основном представляет собой петлю. Мне нужно ускорить программу в кластере. 25 лезвий, по 4 ядра в каждом. Интересно, могу ли я использовать здесь OpenMP и MPI, или вы можете указать мне на учебники, а не на общие случаи, а на сложные и «большие» циклы for.

Спасибо


person Open the way    schedule 27.01.2011    source источник
comment
Мы не сможем оптимизировать ваш код, если вы не опубликуете соответствующий пример кода.   -  person Ed S.    schedule 27.01.2011
comment
Это во многом зависит от того, что на самом деле делает ваш цикл. Например, может ли каждая итерация выполняться независимо от других (и при этом давать правильный результат)? Какие типы зависимостей данных существуют? Дополнительная информация поможет нам дать хороший ответ.   -  person suszterpatt    schedule 27.01.2011
comment
25 Для отдельных лезвий потребуется MPI. Если я правильно помню, OpenMP предназначен для приложений с общей памятью. Что касается ваших глобальных данных, изменятся ли они во время цикла? Если это так, вам нужно будет передать это изменение между всеми узлами, чтобы они оставались текущими.   -  person Will    schedule 27.01.2011


Ответы (2)


На самом деле, вы должны использовать оба.

Используйте MPI для распределения задач между блейдами и OpenMP для полного использования каждого блейда. Потратьте некоторое время, чтобы понять, как память и совместное использование работают в каждом случае.

person Vitor Py    schedule 27.01.2011

Вы не можете разделить свою задачу между лезвиями, используя OpenMP. Попробуйте разделить петлю на несколько частей и распределить по ним мощность. Например, если вам нужна композиция из 2 векторов размера N. N/2 будет на одном узле, а другая часть на другом.

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

person Deck    schedule 27.01.2011