Подходит ли этот такт на Intel i3? - PullRequest
10 голосов
/ 28 ноября 2011

Я принял онлайн для измерения производительности SSE.

#ifndef __TIMER_H__
#define __TIMER_H__

#pragma warning (push)
#pragma warning (disable : 4035)    // disable no return value warning

__forceinline  unsigned int GetPentiumTimer()
{
    __asm
    {
        xor   eax,eax             // VC won't realize that eax is modified w/out this
                                  //   instruction to modify the val.
                                  //   Problem shows up in release mode builds
        _emit 0x0F                // Pentium high-freq counter to edx;eax
        _emit 0x31                // only care about low 32 bits in eax

        xor   edx,edx             // so VC gets that edx is modified
    }
}

#pragma warning (pop)

#endif

Я провел измерения на моем процессоре Pentium D E2200, и он отлично работает (он показывает, что согласованные инструкции SSE выполняются быстрее).Но на моем процессоре i3 я получаю невыровненные инструкции быстрее, 70% тестов.

Как вы думаете, это измерение тактового сигнала не подходит для процессора i3?

Ответы [ 4 ]

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

QueryPerformanceCounter (по крайней мере в Windows) определенно намного лучше, чем встроенная сборка. Я не вижу никакой причины использовать встроенную сборку (что вызовет проблемы при компиляции x64 в Visual Studio, которая не поддерживает встроенную сборку) над этой функцией.

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

0F 31, который является инструкцией RDTSC, все еще может быть полезен для измерения производительности для коротких фрагментов кода.Даже для процессоров i3.Если эффекты переключения задач и переноса потока в другое ядро ​​вас не беспокоят, то можно использовать RDTSC.Во многих случаях вы получаете более точные результаты, вызывая сериализацию с помощью CPUID.

Что касается ваших измерений, вполне возможно, что смещенная SSE работает быстрее на i3.Последние процессоры Intel (архитектуры Nehalem и Sandy Bridge) могут очень эффективно обрабатывать смещенные операнды памяти.Определенно, они никогда не превзойдут выровненные инструкции, но если какие-то другие факторы влияют на производительность в ваших тестах, выровненные инструкции могут работать медленнее.1009 *http://www.agner.org/optimize/#testp. Это хороший пример использования инструкции RDTSC.

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

Как и другие заметили, вы должны использовать QueryPerformanceCounter.

но если вы действительно хотите использовать ассемблер, лучше всего использовать встроенный __rdtsc.

Если вы не хотите использовать встроенное, то это будет лучший подход:

unsigned __int64 __declspec(naked) GetPentiumTimer() {
    __asm {
        rdtsc
        ret
    }
}

Насколько мне известно, Visual C ++ отказывается делать inline для любой функции, которая все равно использует встроенный ассемблер. Используя __declspec (naked), вы указали бы компилятору правильно обрабатывать использование регистра.

Но лучше было бы использовать intrinsic, таким образом, компилятор знал бы, какие регистры используются, и он правильно указывается.

1 голос
/ 29 ноября 2011

QueryPerformanceCounter () - это самый простой способ получить высокочастотный таймер в Windows.Тем не менее, это немного накладные расходы, поскольку это системный вызов - около ½ мкс.Это может быть проблемой, если вы синхронизируете очень быстрые события или вам нужна очень высокая точность.

Если вам нужна точность выше 250 наносекунд, вы можете использовать rdtsc intrinsic для получения оборудованиясчетчик напрямую.На моем i7 задержка составляет около 10 нс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...