Параллельная программа Python-C ++ зависает (память?) - PullRequest
0 голосов
/ 12 мая 2018

У меня есть программа на Python, которая включает в себя ядро ​​C ++.Он написан параллельно, поскольку он очень дорогой в вычислительном отношении, и в настоящее время я заставляю его работать на удаленном сервере на платформе Ubuntu 16.04.

Проблема, с которой я сталкиваюсь, заключается в том, что при определенном количестве циклов(скажем, 2000) для моего тестового примера, он внезапно зависает, не выдавая сообщений об ошибках или чего-либо еще.Я обнаружил часть кода, где он останавливается и является функцией Python, которая не имеет функции for цикла (поэтому я предполагаю, что она не застряла в цикле).Я попытался просто прокомментировать функцию, где она застревает в коде, так как она выполняет незначительные вычисления, и теперь, при точно таком же количестве циклов, она застревает немного вперед, на этот раз внутри написанной части C ++.Я начинаю предполагать, что есть вероятность проблемы с памятью, связанной с сервером.

Выполнение htop из терминала, когда код застрял. Я вижу, что модули, участвующие в вычислениях, полностью загружены, так как они в настоящее время участвуют в некоторых неизвестных вычислениях.Кроме того, память, участвующая в процессе (по крайней мере, когда процесс уже застрял), не полностью занята, так что это также может быть проблемой ОЗУ.

Я также попытался резко сократить количество выходных данных, записываемых в каждом цикле (что, я признаю, где согласовано по размеру), но ничего.При оптимальном количестве процессоров для достижения критической точки в 2000 циклов требуется около 20 минут, поэтому проблема не может быть легко воспроизведена.

Это первый раз, когда я сталкиваюсь с подобными проблемами,Что еще я могу сделать, чтобы выделить проблему?

Спасибо за ответ

1 Ответ

0 голосов
/ 12 мая 2018

Вот что вы можете попробовать.Напишите код, который проверяет, какие итерации происходят, и сохраните все переменные в начале 2000-й итерации.

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

Если это определенно проблема с памятью, код не получитзастрял на 2000 (вот где вы начнете), но застрянет на 4000.

Затем вы можете отслеживать память на 2000-й итерации и копировать ее.

...