У меня есть собственная многопоточная программа на C, которая плавно масштабируется по скорости с количеством ядер ЦП. Я могу запустить ее с потоками 1, 2, 3 и т. Д. И получить линейное ускорение.6-ядерный процессор на коробке с Ubuntu Linux.
У меня была возможность запустить программу на очень мощном Sunfire x4450 с 4 четырехъядерными процессорами Xeon, работающими под управлением Red Hat Enterprise Linux.Я с нетерпением ожидал увидеть, как быстро 16 ядер смогут запускать мою программу с 16 потоками ... Но она работает с той же скоростью, что и ДВА потока!
Много потянув и отладив позже, я вижу, что моя программана самом деле создает все потоки, они действительно работают одновременно, но сами потоки работают медленнее, чем должны быть.2 потока работают примерно в 1,7 раза быстрее, чем 1, но 3, 4, 8, 10, 16 потоков - всего 1,9 раза!Я вижу, что все потоки запущены (не остановлены или не спят), они просто медленные.
Чтобы проверить, не было ли ТС, я запустил ШЕСТНАДЦАТЬ копий своихпрограммировать самостоятельно, одновременно.Все они бежали на полной скорости.Там действительно 16 ядер, и они действительно работают на полной скорости, и там действительно достаточно оперативной памяти (фактически эта машина имеет 64 ГБ, и я использую только 1 ГБ на процесс).
Итак, мой вопрос, есть лиОбъяснение ОПЕРАЦИОННОЙ СИСТЕМЫ, возможно, некоторый лимит ресурсов для каждого процесса, который автоматически сокращает планирование потоков, чтобы не допустить зависания машины одним процессом.
Подсказки:
- Моя программа не имеет доступа к диску или сети.Процессор ограничен.Его скорость линейно масштабируется на одном процессоре в Ubuntu Linux с hexacore i7 для 1-6 потоков.6 потоков - это 6-кратное ускорение.
- Моя программа никогда не запускается быстрее, чем 2-кратное ускорение на этом 16-ядерном корпусе Sunfire Xeon для любого количества потоков от 2 до 16.
- Запуск 16 копий моей программы однопоточный работает отлично, все 16 работают одновременно на полной скорости.
- top показывает 1600% выделенных процессоров./ proc / cpuinfo показывает все 16 ядер, работающих на полной частоте 2,9 ГГц (не на частоте холостого хода низкой частоты 1,6 ГГц)
- Там 48 ГБ ОЗУ свободно, он не обменивается.Что происходит?Есть ли какая-то политика ограничения процессорного времени?Как я мог измерить это, если так?Чем еще можно объяснить такое поведение?
Спасибо за ваши идеи, чтобы решить эту проблему, Великую Тайну Замедления Xeon 2010 года!