2013-09-09 4 views
0

У меня есть приложение C++, которое использует параллельную конструкцию openmp.OpenMP и ограничение памяти

Метод внутри цикла for использует много памяти. Он выделяет память при запуске и освобождает их в конце.

Если в системе достаточно памяти, она работает хорошо, но если памяти недостаточно, операция не работает.

Целевая система может иметь достаточную память, поэтому параллельно может выполняться только 2 потока или, возможно, 3 потока могут выполняться параллельно.

Есть ли способ настроить openmp, чтобы он знал, сколько потоков он должен использовать на основе доступной памяти?

Если OpenMP не может этого сделать, есть ли способ, которым я могу это сделать сам?

ответ

1

OpenMP очень тупой, когда дело доходит до мониторинга использования памяти, и вам придется реализовать его самостоятельно. Хорошей стратегией было бы получить количество полезной памяти, а затем разделить ее на потребность в памяти в потоке, чтобы получить верхний предел количества потоков, которые могут обрабатывать данные одновременно. После того, как вы знаете, что номер, вы могли бы заставить parallel регион работать с таким количеством потоков, используя num_threads пункт:

int max_threads = mem_size/mem_per_thread; 

#pragma omp parallel for num_threads(max_threads) 
for (...) 
{ 
} 

Теперь жесткий вопрос в том, как получить объем доступной памяти, особенно с учетом того, что практически все современные операционные системы реализуют виртуальную память. Одним из решений было бы оставить это конечному пользователю, например. укажите параметр в конфигурации вашей программы, который пользователь может установить на определенное значение, которое он сочтет разумным. Другой стратегией может быть установка значения для данного% физического объема памяти.