Параллельные процессы намного медленнее, чем один процесс - PullRequest
0 голосов
/ 14 ноября 2018

Я моделирую и решаю нелинейную программу (NLP), используя однопоточный CPLEX с AMPL (я ограничиваю CPLEX явно использовать только один поток) в CentOS 7. Я использую процессор с 6 независимыми ядрами (intel i7 8700) решить 6 независимых тестовых примеров.

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

Я проверил поведение этих процессов с помощью top / htop.Они получают разные процессоры для выполнения.Поэтому мой вопрос заключается в том, как выполнение этих тестов одновременно оказало бы такое большое влияние на прошедшее время, если бы они решали в разных ядрах только один поток, и они были отдельными процессами?

Любые мысли приветствуются.

1 Ответ

0 голосов
/ 14 ноября 2018

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

1) Разделяют ли отдельные потоки ресурсы?Если да, что это за ресурсы, и когда вы обращаетесь к ним, они блокируют другие потоки?

2) На какой самый медленный ресурс опирается ваш многопоточный код?Распространенным узким местом (и часто игнорируемым) является дисковый ввод-вывод.Несколько потоков могут обрабатывать данные намного быстрее, но они не заставляют читать диск быстрее, и во многих случаях многопоточность может сделать его намного хуже (например, трэшинг) .

3) Доступ к общемуресурсы правильно синхронизированы?

С этой целью, и, не зная больше о вашей проблеме, я бы порекомендовал:

a) Не читать разные файлы из разных потоков.Вы хотите, чтобы дисковый ввод-вывод был максимально последовательным, а это проще всего из одного потока.Может быть, пакетное чтение файлов из одного потока и , а затем отправка их на обработку.

b) Держите ваши потоки настолько автономными, насколько это возможно - любое общение назад и вперед приведет к конфликту потоков и замедлит процесс.

...