Потенциальные проблемы с многопоточным приложением, требующим большого объема вычислений - PullRequest
3 голосов
/ 20 марта 2011

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

После ряда проблем из-за недостатка опыта в программировании многопоточных проектов мне кажется, что мне наконец-то удалось заставить его работать так, как я планировал.Расчеты выбираются один за другим из очереди и обрабатываются одновременно.Следуя конкретному совету (относительно соответствующего количества потоков), я получил в ответ на предыдущий вопрос Я настроил его так, чтобы один поток заполнял очередь процесса, а остальныепотоки в пуле последовательно выбирают процессы из очереди.На моей машине i7 с 8-ядерным процессором у меня был 1 производитель + 8 потребителей = 9 потоков.

Теперь мой вопрос таков:

Неудивительно, что когда все работает, как задумано, загрузка процессора ЦП машины падает на крышу.Я следил за использованием процессора через Gnome System Monitor, и кажется, что ядра находятся на 90-100% -ной нагрузке на этапе анализа программного обеспечения.Помимо замедления работы других программ (например, браузера, почты, чтения PDF-файлов и т. Д.), Работающих одновременно, есть ли другие потенциальные проблемы, о которых мне следует знать?Может ли высокая нагрузка создать какие-либо артефакты, например, в JVM?

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

Заранее спасибо,

1 Ответ

3 голосов
/ 20 марта 2011

Если это сложная вычислительная задача, то я считаю полезным запускать такие задачи с приоритетом в фоновом режиме. Если задача не требует большого объема памяти и не вызывает большого объема подкачки, это должно позволить другим процессам работать в основном беспрепятственно, в то же время позволяя вычислительному процессу получать львиную долю фактического доступного ЦП. Если вы работаете в Windows, то иногда графический интерфейс перестает отвечать на запросы, и вам может быть трудно убить процесс или выполнить другую работу. (Unix / Linux лучше в этом отношении, но это все еще может раздражать.)

Вы действительно хотите убедиться, что вы не используете столько памяти, что ваша машина начинает меняться как сумасшедшая.

...