Измерьте скорость процессора, считая инструкции по сборке - PullRequest
10 голосов
/ 10 августа 2011

Редактировать: Мой оригинальный пример был глупой ошибкой.После исправления я все еще получаю странные результаты.


В моей наивной попытке измерить скорость моего процессора методом "грубой силы", я сделал программу ниже:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#pragma comment(linker, "/entry:mainCRTStartup")
#pragma comment(linker, "/Subsystem:Console")

int mainCRTStartup()
{
    char buf[20];
    clock_t start, elapsed;
    unsigned long count = 0;
    start = clock();
    __asm
    {
        mov EAX, 0;
    _loop:
        add EAX, 3; // accounts for itself and next 2 instructions
        cmp EAX, 0xFFFFFFFF - 0x400;
        jb _loop;
        mov count, EAX;
    }
    elapsed = clock() - start;
    _gcvt(count * (long long)CLOCKS_PER_SEC / (elapsed * 1000000000.0), 3, buf);
    puts(buf);
}

Что разбивается на что-то вроде:

mainCRTStartup:
  push   ebp
  mov    ebp,esp
  sub    esp,28h
  mov    dword ptr [count],0
  call   dword ptr [_clock]
  mov    dword ptr [start],eax
  mov    eax,0

_loop:
  add    eax,03h
  cmp    eax,0FFFFFBFFh
  jb     _loop

  mov    dword ptr [count],eax
  call   dword ptr [_clock]
  sub    eax,dword ptr [start]

  ...    // call _gcvt, _puts, etc.

  mov    esp,ebp
  pop    ebp
  ret

Обратите внимание, что цикл состоит из 3 инструкций , поэтому конечное значение eax должно быть общим количеством инструкций.

Почему я получаю 4.2 при запуске этого?

Ответы [ 4 ]

11 голосов
/ 10 августа 2011

Поскольку параллелизм на уровне команд и суперскалярная архитектура позволяют выполнять несколько инструкций в одном конвейерном тактовом цикле.

Например, в вашем коде прогноз ветвления эффективно исключает инструкцию cmp для всех, кроме последней итерации _loop, путем:

  1. выполнение cmp и jb параллельно, и
  2. всегда с ответвлением jb.

Конечно, (2) выбрасывается на последняя итерация, которая приводит к очистке конвейера.Дополнительные ~ 20 циклов (для 20-этапного конвейера) пренебрежимо малы, поскольку ваш цикл имеет порядок 10 ^ 9 инструкций.

компилятор не должен оптимизировать это

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

9 голосов
/ 10 августа 2011

Поскольку скорость процессора измеряется не в байтах в секунду, а в циклах команд в секунду, особенно в x86, некоторые инструкции занимают более 1 цикла.

См. на этой странице для синхронизации команд.(На самом деле, это только до 486 - все еще ищет хороший справочник для современных процессоров).

2 голосов
/ 10 августа 2011

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

1 голос
/ 11 августа 2011

Вы можете измерить цикл, используя инструкцию rdtsc , которая считает циклы внутренней частоты ЦП. Разница между двумя показаниями заключается в количестве пройденных циклов. Позвольте вашему коду выполнить 1000 циклов, умножить на три (инструкции в цикле) и разделить на прошедшие циклы. Это даст вам инструкции за цикл. Который вы затем можете масштабировать до собственной частоты вашего процессора.

Имейте в виду, что, поскольку ваш код очень короткий, он, скорее всего, будет выполняться из уровня кэша 1 (или из средства предварительной выборки?), Что делает его действительным только для этого случая, а не для процессора в целом. Для конвейера может быть слишком мало, чтобы сделать из него что-то стоящее.

Что касается сроков инструкций , эта страница выглядит более актуальной, чем та, которую предложил AShelly. Он регулярно пересчитывается Torbjörn Granlund из Шведского королевского технологического института .

...