Насколько «быстры» современные процессоры? - PullRequest
18 голосов
/ 11 января 2009

Когда я использовал для программирования встроенных систем и более ранних 8/16-битных ПК (6502, 68K, 8086), у меня было довольно хорошее представление о том, как долго (в наносекундах или микросекундах) выполнялась каждая инструкция. В зависимости от семейства один (или четыре) цикла приравниваются к одному «извлечению памяти», и без кэшей, о которых следует беспокоиться, можно угадать время, основываясь на количестве обращений к памяти.

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

Итак, кто-нибудь может предоставить некоторые временные параметры для двух примеров инструкций, скажем, на 2 ГГц Core 2 Duo. Лучшие и худшие случаи (при условии, что в кеше ничего нет / все в кеше) были бы полезны.

Инструкция # 1: Добавить один 32-битный регистр в секунду.

Инструкция # 2: Переместить 32-разрядное значение из регистра в память.

Редактировать : Причина, по которой я спрашиваю об этом, состоит в том, чтобы попытаться разработать «практическое правило», которое позволило бы мне взглянуть на простой код и приблизительно измерить время, затраченное на ближайший порядок величины ,

Редактировать # 2: Множество ответов с интересными моментами, но никто (пока) не записал цифру, измеренную во времени. Я понимаю, что в этом вопросе есть «осложнения», но давайте: если мы сможем оценить количество настройщиков пианино в Нью-Йорке , мы сможем оценить время выполнения кода ...

Возьмите следующий (немой) код:

int32 sum = frigged_value();

// start timing
 for (int i = 0 ; i < 10000; i++)
 {
   for (int j = 0 ; j < 10000; j++)
   {
     sum += (i * j)
   }
   sum = sum / 1000;
 }

// end timing

Как мы можем оценить сколько времени потребуется, чтобы пробежать ... 1 фемтосекунду? 1 гиг?

Ответы [ 14 ]

3 голосов
/ 11 января 2009

Все, что вам нужно, находится в соответствующих руководствах по процессору. И у AMD, и у Intel есть PDF-файлы, доступные на их веб-сайте с описанием задержек каждой инструкции.

Просто помните о сложности современных процессоров. Они не выполняют одну инструкцию за раз, они могут загружать 3-4 инструкции за цикл, и почти все инструкции передаются по конвейеру, поэтому, когда загружаются следующие инструкции, текущие не заканчиваются. Он также переупорядочивает инструкции, чтобы обеспечить более эффективное планирование. Современный процессор может легко выполнять одновременно 50 команд.

Итак, вы задаете не тот вопрос. Время, затрачиваемое на одну инструкцию, сильно зависит от того, как и когда вы измеряете. Это зависит от того, насколько занят декодер команд, на предикторе ветвления, на расписании и на котором запланированы другие инструкции, в дополнение к простым вопросам, таким как кэширование.

2 голосов
/ 27 января 2009

Я рекомендую скачать руководство по оптимизации программного обеспечения AMD .

2 голосов
/ 11 января 2009

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

Худший случай - до нескольких миллисекунд (когда ОС обрабатывает ошибку страницы и должна извлечь данные / инструкцию с диска). Исключение диска / подкачки все равно зависит от того, есть ли у вас компьютер NUMA, какая у него топология, в каком узле памяти находятся данные, есть ли одновременный доступ с другого ЦП (протоколы блокировки шины и синхронизации кэша) и т. Д. 1003 *

0 голосов
/ 26 января 2009

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

...