Вопрос

Я ищу способы выполнения микро-бенчмарков на многоядерных процессорах.

Контекст:

Примерно в то же время, когда настольные процессоры начали выполняться не по порядку, что затрудняло прогнозирование производительности, они, возможно, не случайно, также ввели специальные инструкции для получения очень точных таймингов.Примерами этих инструкций являются rdtsc на x86 и rftb на PowerPC.Эти инструкции давали тайминги, которые были более точными, чем когда-либо могли быть допущены системным вызовом, позволяли программистам проводить микротестирование из последних сил, к лучшему это или к худшему.

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

Вопрос:

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

Некоторые системы могут позволять отключать ядра, оставляя запущенным только одно.Я знаю, что Mac OS X Leopard работает, когда установлена правая панель настроек из инструментов разработчика.Считаете ли вы, что это делает rdtsc безопасно ли использовать снова?

Больше контекста:

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

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

  2. Мне нужны цифры для публикации, сроки выполнения которой я не контролирую.

Это было полезно?

Решение

В OSX (ARM, Intel и PowerPC) вы хотите использовать mach_absolute_time( ):

#include <mach/mach_time.h>
#include <stdint.h>    

// Utility function for getting timings in nanoseconds.
double machTimeUnitsToNanoseconds(uint64_t mtu) {
    static double mtusPerNanosecond = 0.0;
    if (0.0 == mtusPerNanosecond) {
        mach_timebase_info_data_t info;
        if (mach_timebase_info(&info)) {
            // Handle an error gracefully here, whatever that means to you.
            // If you do get an error, something is seriously wrong, so
            // I generally just report it and exit( ).
        }
        mtusPerNanosecond = (double)info.numer / info.denom;
    }
    return mtu * mtusPerNanosecond;
}

// In your code:
uint64_t startTime = mach_absolute_time( );
// Stuff that you want to time.
uint64_t endTime = mach_absolute_time( );
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime);

Обратите внимание, что для этого нет необходимости ограничиваться одним ядром.ОПЕРАЦИОННАЯ система выполняет исправление, необходимое за кулисами для mach_absolute_time( ) давать значимые результаты в многоядерной (и многосетевой) среде.

Другие советы

Ядра возвращают правильные синхронизированные значения для «RTDSC». Если у вас есть MultiSocket Machine, вы должны исправить процесс в одну розетку. Это не проблема.

Основная проблема заключается в том, что планировщик делает данные ненадежными. Существует некоторая производительность API для ядра Linux> 2.6.31, но я не смотрел на него. Windows> Vista делает отличную работу здесь, используйте QuerythreadcycleTime и QueryProcessCycletime.

Я не уверен в OSX, но AFAIK «Mach_absolute_time» не регулирует запланированное время.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top