С чем может быть связан малый прирост производительности от увеличения числа потоков?
Работаю в Geant4 - это такой пакет для моделирования взаимодействия элементарных частиц с веществом, разработанный в CERN. Весь код в нём открыт, находится в свободном доступе. Грубо говоря, это набор библиотек, написанных на языке C++. Geant4 поддерживает мультитрейдинг.
В общем, запускал я ради теста одну и ту же задачу на слабом ноутбуке и на сильном. Вычисления ведутся на процессоре. Я не помню точно что за процессор на слабом ноутбуке, сейчас его нет под рукой, но это довольно новый Core i3 с базовой частотой 2 ГГц и L3 кэш 3 или 4 Мб, 2 физических и 4 логических ядер. Второй это Ryzen 7 4800h с базовой частотой 2.9 ГГц, и 8 Мб L3 кэша, 8 физических и 16 логических ядер. В общем, первый справился с задачей за 16 минут 44 секунды, а второй всего лишь за 5 минут 40 секунд. То есть прирост оказался даже чуть меньше, чем в 3 раза, хотя количество ядер отличается в 4 раза, не говоря уже о тактовой частоте. Та же задача на сильном ноутбуке, запущенная на 4 потоках посчиталась за 12 минут 30 секунд. У меня возникает вопрос из-за чего прирост производительности оказался таким слабым? Я ожидал прирост минимум в 4 раза, так как на сильном ноутбуке ещё и тактовая частота выше. Может ли быть проблема в нехватке L3 кэша? Или это плохая оптимизация под много поточность? Или вовсе другая причина? Хотя вроде они заявляют о хорошей линейности, на сколько я понял: https://twiki.cern.ch/twiki/bin/view/Geant4/MultiThreadingTaskForce https://indico.cern.ch/event/781244/contributions/3251900/attachments/1782717/2901032/Multithreading.pdf Хотя, как я понял, в тесте на Intel Xeon Phi, тест сначала шёл в однопоточном режиме и показывал хорошую линейность от числа задействованных физических ядер. Но в моём случае в обоих случая задействовано максимальное число потоков.
Если я допустил ошибки или поставил не те метки, подскажите где ошибки или какие метки надо поставить.
Если тему не закроют, то вечером выложу результаты ещё одного небольшого теста с графиками.
Ответы (2 шт):
Есть тысячи причин, которые могут влиять на это все.
Самое первое - никто не отменял закон Амадала. Грубо говоря, чем больше кода, который нельзя распараллелить, тем меньше будет ускорение. И рост ускорения будет даже не линейный.
второе - у Вас в сравнении процессоры разных производителей. А так как код можно заточить под команды конкретного процессора, особенности контроллера памяти, то разница может быть существенная. Когда то давно на AMD медленнее работал Word, так как использовал арифметику, которая работала быстрее на Intel.
третье - процессор далеко не самый важный критерий. Объем памяти или диск часто могут сильно повлиять на ситуацию. Хотя даже банальный антивирусник может такого натворить, что уххх.
Дальше. Есть такая штука, как тротлинг - это когда процессор или другая часть ноутбука/копьютера перегревается и понижается частота/скорость работы. И потом в тестах первые пять минут выигрывает одна конфигурация, а спустя два часа наряженной работы, ситуация меняется кардинально. Вот сейчас такое происходит с видеокартами nvidia rtx3080 - многие видеокарты зависали под нагрузкой и свежие драйвера просто понизили производительность ... - тестируйте:)
Проблему я давно решил, но думаю, что нужно ещё сюда на всякий случай отписаться. Виноват в плохой производительности я сам, ибо создал отладочную сборку джеанта. Когда я это понял и пересобрал в релизе, производительность возросла в несколько раз. Тестировал на одной из задач, скорость возросла примерно в 7.5 раз.