Как портировать ассемблерный код для скорости процессора в Visual Studio 2008 - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть следующий код, который необходимо перенести в Visual Studio 2008. Он вычисляет, сколько циклов процессор выполняет за микросекунду, чтобы вычислить скорость процессора:

typedef unsigned long long TProcessorClockTicks;

inline TProcessorClockTicks readProcessorTimeStamp()
{
#   if defined(_ARCH_linux_24_i86) ||               \
    defined(_ARCH_linux_26_i86) ||              \
    defined(_ARCH_cygwin) ||                    \
    defined(_ARCH_freebsd_61_i86)
        TProcessorClockTicks x;
        __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
        return x / 1000;
#   elif defined(_ARCH_sol2)
        return (TProcessorClockTicks) ::gethrtime();
#   else
#       error  Must define _ARCH_??? preprocessor macro to build    \
        this code!
#   endif
}

typedef unsigned long long TProcMHz;

inline
TProcMHz
measureProcessorSpeedMHz()
{
  // Get the number of the processor clock cycles in a microsecond which should
  // be the processor clock speed in MHz.
  ::usleep(1);  // Put a sleep before to ensure accurate measurement.

  TProcessorClockTicks before = readProcessorTimeStamp();

  ::usleep(1); 

  TProcessorClockTicks after = readProcessorTimeStamp();

  return (TProcMHz) (after - before); 
}

Что такое заменадля тела readProcessorTimeStamp ()?

    TProcessorClockTicks x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x / 1000;

1 Ответ

4 голосов
/ 29 ноября 2011

Ваш код предполагает, что ::usleep(1) спит ровно одну микросекунду. Я не знаю, насколько это хорошо для Linux. Это конечно не очень хорошее предположение в Windows. По крайней мере, не в режиме пользователя.

В Windows нет стандартных таймеров микросекундного уровня. Лучшее, что вы можете сделать со стандартными вызовами API - это одна миллисекунда, и даже это переменная. Чтобы получить разумную оценку тактовой частоты, вам нужно указать истекшее время, а также количество пройденных тактов.

Или вы можете запросить реестр. См. http://www.codeproject.com/KB/system/Processor_Speed.aspx для некоторых опций.

...