openMP: параллельная работа всех потоков приводит к исключениям нехватки памяти - PullRequest
0 голосов
/ 02 октября 2019

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

Алгоритм отлично работает с одним или ограниченным числом (= 2) потоков.

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

Для решения проблемы,Я заменил «выброс исключений» на «ожидание свободной памяти» в случае нехватки памяти, что привело к тому, что многие (<= all) потоки просто ожидали освобождения памяти .. .

Есть ли какое-либо решение / инструмент / подход для динамического обслуживания памяти или запуска потоков в зависимости от доступной памяти?

1 Ответ

0 голосов
/ 08 октября 2019

Попробуйте скомпилировать вашу 64-битную программу. 32-разрядные программы могут иметь до 2 ^ 32 = около 4 ГБ памяти. 64-битные программы могут использовать значительно больше (2 ^ 64, что составляет 18 эксабайт). В наши дни очень легко набрать 4 ГБ памяти.

Обратите внимание, что если вы используете больше ОЗУ, чем у вас есть, вашей ОС придется перенести часть памяти на диск. Это может сильно повредить производительности. Если вы дойдете до этой точки (где вы используете значительную часть ОЗУ) и у вас останутся дополнительные ядра, вам придется углубиться в алгоритм, чтобы найти более детализированный участок для распараллеливания.

Если вы дляпо какой-то причине невозможно переключиться на 64-разрядную версию, вы можете выполнять многопроцессорную обработку (запускать несколько экземпляров программы), чтобы каждый процесс имел до 4 ГБ. Вам нужно будет как-то запустить и скоординировать процессы. В зависимости от ваших потребностей это может означать использование простых аргументов командной строки или сложного межпроцессного взаимодействия (IPC). OpenMP не делает IPC, но Open MPI делает. Открытый MPI обычно используется для связи между многими узлами в сети, но его можно настроить для одновременного запуска экземпляров на одном компьютере.

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