Является ли этот тактовый тик подходящим для 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.