Почему Matlab работает быстрее после "прогрева" скрипта?

Я заметил, что при первом запуске скрипта это занимает значительно больше времени, чем во второй и третий раз 1. "Разминка" упоминается в этом вопросе без объяснения причин.

Почему код работает быстрее после того, как он "прогрелся"?

Я не clear all между вызовами 2, но входные параметры меняются при каждом вызове функции. Кто-нибудь знает почему это?


1. У меня есть лицензия локально, так что это не проблема, связанная с проверкой лицензии.

2. На самом деле, поведение не меняется, если я clear all ,

4 ответа

Решение

Одна из причин, по которой он будет работать быстрее после первого раза, состоит в том, что многие вещи инициализируются один раз, а их результаты кэшируются и повторно используются в следующий раз. Например, на стороне M переменные могут быть определены как постоянные в функциях, которые могут быть заблокированы. Это также может происходить на стороне MEX.

Кроме того, многие зависимости загружаются после первого раза и остаются в памяти для повторного использования. Это включает M-функции, классы ООП, классы Java, MEX-функции и так далее. Это относится как к встроенным, так и к пользовательским.

Например, выполните следующую команду до и после запуска сценария для первого запуска, затем сравните:

[M,X,C] = inmem('-completenames')

Обратите внимание, что clear all не обязательно очищать все вышеперечисленное, не говоря уже о заблокированных функциях...

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

Матлаб интерпретируется. Если вы не прогреете код, вы потеряете много времени из-за интерпретации вместо фактического алгоритма. Это может существенно исказить результаты таймингов.

Выполнение кода хотя бы один раз позволит Matlab фактически скомпилировать соответствующие сегменты кода.

Помимо специфических для Matlab причин, таких как JIT-компиляция, современные процессоры имеют большие кеши, предикторы ветвлений и так далее. Разогрев это проблема для тестирования даже на ассемблере.

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

Функция Intel Turbo становится еще более интересной: когда позволяют ограничения мощности и температуры, процессор может работать быстрее, чем его устойчивая максимальная частота. Таким образом, первые ~20 секунд до 1 минуты вашего теста могут работать быстрее, чем остальные, если вы не будете осторожны, чтобы контролировать эти факторы.

Еще одна проблема, не затронутая Амро и Марком, - распределение памяти (до).
Если ваш сценарий предварительно не выделяет память, его первый запуск будет очень медленным из-за выделения памяти. По завершении первой итерации вся память выделяется, поэтому последовательные вызовы сценария будут более эффективными.

Наглядный пример

for ii = 1:1000
    vec(ii) = ii; %// vec grows inside loop the first time this code is executed only
end
Другие вопросы по тегам