Szukam wydajności testów porównawczych za pomocą rejestru znacznika czasu (TSR) znalezionego w procesorach x86. Jest to przydatny rejestr, ponieważ mierzy on w monotonicznej jednostce czasu, która jest odporna na zmianę prędkości zegara. Bardzo fajny.Czy znacznik czasu Intela czyta przykład kodu asm przy użyciu dwóch dodatkowych rejestrów, niż jest to konieczne?
Oto dokument firmy Intel pokazujący fragmenty kodu ASM do rzetelnego testu porównawczego za pomocą TSR, w tym użycie narzędzia cpuid do synchronizacji potoku. Patrz strona 16:
Aby odczytać godzinę rozpoczęcia, to mówi (I odnotowany trochę):
__asm volatile (
"cpuid\n\t" // writes e[abcd]x
"rdtsc\n\t" // writes edx, eax
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t"
//
:"=r" (cycles_high), "=r" (cycles_low) // outputs
: // inputs
:"%rax", "%rbx", "%rcx", "%rdx"); // clobber
Zastanawiam się dlaczego rejestry zdrapki są wykorzystywane do podejmowania wartości edx
i eax
. Dlaczego nie usunąć movs i nie odczytać wartości TSR zaraz po edx
i eax
? Tak:
__asm volatile(
"cpuid\n\t"
"rdtsc\n\t"
//
: "=d" (cycles_high), "=a" (cycles_low) // outputs
: // inputs
: "%rbx", "%rcx"); // clobber
W ten sposób można zaoszczędzić dwa rejestry, zmniejszając prawdopodobieństwo C kompilatora, która chciałaby rozlać.
Mam rację? Czy te MOV są w jakiś sposób strategiczne?
(zgadzam się, że potrzebujemy rejestrów zarysowania odczytać godzinę przystanek, jak w tym scenariuszu kolejność instrukcji jest odwrotna: trzeba rdtscp, ..., CPUID instrukcji CPUID niszczy. wynik rdtscp).
Dzięki
Nie jestem ekspertem od wbudowanej składni GCC, ale zgaduję, że w drugiej wersji GCC wygeneruje * movs * samodzielnie, więc jest to kwestia czytelności. Uwaga boczna: nie powinno się '' rdtsc'be * otaczać * serializującymi instrukcjami, nie tylko wcześniej? Zwykle używam 'lfence' na rzecz' CPUID', ponieważ jest to lokalna serializacja i nie blokuje żadnego rejestru. –
Spodziewam się, że pół-sprytny kompilator ponownie użyje rejestru wyjściowego dla zmiennej lokalnej, ale mogę się mylić. –
Odnośnie 'lfence', czy masz źródło, które demonstruje? –