Является ли этот тактовый тик подходящим для Intel i3?

Я принял онлайн для измерения производительности 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?

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Что касается ваших измерений, вполне возможно, что смещенный SSE работает быстрее на i3. Последние процессоры Intel (архитектуры Nehalem и Sandy Bridge) могут эффективно обрабатывать неправильные операнды памяти. Определенно, они никогда не превзойдут согласованные инструкции, но если некоторые другие факторы влияют на производительность в ваших тестах, выровненные инструкции могут работать медленнее.

Edit:

См. http://www.agner.org/optimize/#testp. Это хороший пример использования инструкций RDTSC.

Ответ 4

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

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