2010-04-17 11 views
2

Есть ли способ использовать C или ассемблер или, возможно, даже C#, чтобы точно определить, сколько времени требуется для выполнения инструкции ADD?измерять время для выполнения одной инструкции

+0

Я считаю, что есть статья об этом плавании в земле ACM, я проверю – Woot4Moo

+2

В руководстве по программированию вашего процессора будет указано количество циклов, необходимых для выполнения конкретной инструкции. – 2010-04-17 15:05:47

+3

Это очень ошибочная метрика, Нейл. Современные процессоры намного сложнее, чем могут быть учтены простым подсчетом циклов. Рассмотрим «ADD r32, r/m32' - если вы нажмете память (m32), у вас проблемы с кешем, чтобы рассмотреть, например. L1 против L2 против фактической основной памяти дает вам гигантские различия в скорости выполнения (не обращая внимания на виртуальную память!). И это даже не вводит суперскалярные архитектуры или конвейерную обработку, а также целую кучу других проблем в глубине глубины процессора. –

ответ

11

Да, вроде, но это нетривиально и дает результаты, которые почти бессмысленны, по крайней мере, на самых разумно современных процессорах.

На относительно медленных процессорах (например, через оригинальный Pentium в линейке Intel, по-прежнему верны на большинстве небольших встроенных процессоров), вы можете просто посмотреть в листе данных процессора, и он (обычно) скажет вам, сколько часов клещей ожидать. Быстро, просто и легко.

На современной настольной машине (например, Pentium Pro или новее) жизнь не почти это просто. Эти процессоры могут выполнять сразу несколько инструкций и выполнять их не по порядку, если между ними нет никаких зависимостей. Это означает, что вся концепция времени, проведенного одной инструкцией, становится почти бессмысленной. Время, затраченное на выполнение одной инструкции, может и будет зависеть от инструкций, которые ее окружают.

Сказанное: да, если вы действительно этого хотите, вы можете (как правило - в зависимости от процессора) что-то измерить, хотя на вопрос, насколько это действительно будет означать, достаточно большой вопрос. Даже получить такой результат, это только рядом с бессмысленным, а не совершенно бессмысленным, но не тривиально. Например, на чипе Intel или AMD вы можете использовать RDTSC для самого измерения времени. Это, к сожалению, может быть выполнено не по порядку, как описано выше. Чтобы получить значимые результаты, вам необходимо окружить его инструкцией, которая не может быть выполнена не в порядке («инструкция сериализации»).Наиболее распространенный выбор для этого - CPUID, так как это одна из нескольких инструкций по сериализации, доступных для программ «пользовательский режим» (т. Е. Кольцо 3). Это добавляет немного завихрения, хотя: как документировано Intel, первые несколько раз процессор выполняет CPUID, это может занять больше времени, чем в последующие моменты времени. Таким образом, они рекомендуют выполнить его три раза раз, прежде чем использовать его для сериализации вашего времени. Таким образом, общая последовательность работает что-то вроде этого:

.align 16 
CPUID 
CPUID 
CPUID 
RDTSC 
; sequence under test 
Add eax, ebx 
; end of sequence under test 
CPUID 
RDTSC 

Затем сравните, что в результате делать то же самое, но с последовательностью испытываемого удалены. Это оставляя довольно детали Ф.Е., конечно, - как минимум, вам нужно:

  1. установки регистров правильно перед каждым CPUID
  2. сохранить значение в EAX: EDX после первого RDTSC
  3. вычитают результат от второго RDTSC от первого

Также обратите внимание на введенную мной директиву «align» - выравнивание команд может также повлиять на время, особенно если задействован цикл.

+0

Я попытался сказать эту часть, о значении измерения, но вы сказали это лучше. вы получите мой +1! – JustJeff

-3

Нет, но вы можете рассчитать его, исходя из количества тактов, которые команда add требует умножить на тактовую частоту CPU. Различные типы аргументов для ADD могут приводить к большему или меньшему количеству циклов, но для данного списка аргументов команда всегда занимает столько же циклов для завершения.

Было сказано, почему вас это волнует?

+0

Фактически ADD в компьютерной земле всегда 1 регистр плюс другой. Это никогда не будет 7 регистров сразу, так что это ложь. – Woot4Moo

+0

Мне очень нравится исследование, которое я делаю. –

+0

@WootMoo: Это зависит от процессора и набора команд. Например, VAX имеет инструкцию «AddP6» («Добавить упакованный, 6 операндов»). X86 также не соответствует вашему описанию. –

2

Построить цикл, который выполняет 10 миллионов раз, без ничего в теле цикла и времени. Храните это время в качестве накладных расходов, необходимых для цикла.

Затем выполните тот же цикл снова, на этот раз с тестируемым кодом в теле. Время для этого цикла, минус накладные расходы (из случая с пустым циклом), - это время из-за 10 миллионов повторений вашего тестируемого кода. Итак, разделите на количество итераций.

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

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

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

0

Хорошо, проблема, с которой вам придется столкнуться, если вы используете ОС, такую ​​как Windows, Linux, Unix, MacOS, AmigaOS и все остальные, которые уже работают на вашей машине в фоновом режиме, что будет влияние удара. Единственный реальный способ вычисления фактического времени команды - разобрать материнскую плату и протестировать каждый компонент с помощью внешнего оборудования. Это зависит от того, хотите ли вы это сделать сами или просто выяснить, насколько быстро выполняется типичная ревизия вашего процессора. Такие компании, как Intel и Motorola, тщательно тестируют свои чипы перед выпуском, и эти результаты доступны для общественности. Все, что вам нужно сделать, это спросить их, и они отправят вам бесплатный CD-ROM (это может быть педантизм с DVD-версией) с содержащимися в нем результатами. Вы можете сделать это сами, но будьте осторожны, особенно процессоры Intel содержат много избыточных инструкций, которые больше не желательны, не говоря уже о необходимости. Это займет много времени, но я могу абсолютно понять, как это сделать. PS. Если его чисто для того, чтобы помочь прототипу аппаратного обеспечения вашей собственной машины до его теоретического максимума в личном проекте, который вы делаете, ответ Just Jeff выше отлично подходит для создания аккуратных средних значений скорости обучения в реальных условиях.

 Смежные вопросы

  • Нет связанных вопросов^_^