Почему время, необходимое для выполнения кода на сайте «Хакерранк», значительно варьируется? - PullRequest
0 голосов
/ 15 апреля 2020

Когда вы пытаетесь выполнить некоторые задачи по кодированию на www.hackerrank.com и также отслеживаете время (например, в C ++ с использованием библиотеки "chrono"), вы будете видеть, что каждый раз, когда вы запускаете код, вы получаете различное время, необходимое для выполнения в точно такой же кодекс. Дисперсию я оцениваю в 10-30 процентов. В чем причина того, что время выполнения кода значительно меняется при одинаковом коде? Какие факторы влияют на это?

Это может быть серверная система; но есть ли даже физические причины (стохастические c процессы в электронных c компонентах)?

1 Ответ

2 голосов
/ 15 апреля 2020

Почти наверняка просто загруженная система, где ваш процесс конкурирует за процессорное время с другими процессами. (И конкурирует за пропускную способность памяти, даже когда у него есть процессор).


Также вероятно, что сервер работает на процессоре с SMT (одновременная многопоточность), который использует каждый физические ядра как два логических ядра, так что «общие ресурсы выполнения», за которые конкурируют процессы, включают в себя компоненты внутри одного ядра процессора, а не только кэш-память L3 и пропускную способность памяти.

Intel называет свою технологию SMT " гиперпоточностью"; большинство серверов в настоящее время работают на процессорах Intel Xeon. AMD Zen также использует SMT, так что в любом случае, если администраторы сервера не отключили его, когда ОС планирует задачи на обоих логических ядрах одного физического ядра, они немного замедляют друг друга (причем величина замедления в основном зависит от их среднего IP *) 1039 * (количество инструкций за цикл) - два потока, которые имеют много ошибочных прогнозов ветвлений, обычно не видят большого замедления (так что пропускная способность почти удваивается). Но два потока, которые оба могут почти полностью насытить ALU множителя FP, будут работать почти со всеми половинная скорость (почти нулевой выигрыш в пропускной способности).

ОС "знают" о SMT / Hyperthreading и могут определять, какие логические ядра разделяют физическое ядро. Они пытаются избежать планирования потоков на одно и то же физическое ядро, в то время как есть некоторые физические ядра с обоими потоками простаивают.

См. также Современные микропроцессоры 90-минутное руководство! , которое охватывает SMT, с фоном для понимания того, какие ресурсы выполнения используются совместно.


но есть ли en физические причины (стохастические c процессы в электронном c компонентах)?

Нет, процессоры детерминированы c (за исключением инструкции rdrand, которая использует настоящий аналоговый электрический шум в качестве источник случайности).

ЦП используют динамическое масштабирование напряжения и частоты c для экономии энергии (холостой ход или максимальное турбо, или где-то посередине, если тепловые ограничения не позволяют максимальное турбо.) https://en.wikipedia.org/wiki/Intel_Turbo_Boost / https://en.wikipedia.org/wiki/Dynamic_frequency_scaling

См. Также Idiomati c способ оценки производительности? для большего количества микробенчмаркинг-ловушек / эффектов прогрева .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...