Assembly Code Snippet to measure base CPU Frequency
Basically the base (not turbo boosted) CPU Frequency is amount of TSC Increments per one second.
A very simple code snippet to get it:
EUROASM AutoSegment=Yes, CPU=X64, SIMD=AVX2
getbase PROGRAM Format=PE, Width=64, Model=Flat, IconFile=, Entry=main:
INCLUDE winscon.htm, winabi.htm, cpuext64.htm
MsgFmt D "TSC Ticks per 1 s = %%d[u]; Base CPU Frequency is %%f[p2] GHz",13,10,0
Ticks DB Q
Freq DB Q
Divider DO Q 1_000_000_000
LINK cvirt.lib
main: nop
WinABI SetStdioWindowOptions,0,0 ; prevent to move to front
WinABI GetCurrentThread ; This one will be in RAX
WinABI SetThreadAffinityMask, RAX, 1 ; RCX is thread param (core#)
WinABI SetThreadPriority, RAX, 15 ; RCX is thread param (core#)
WinABI QueryPerformanceFrequency, Freq
mov r15, [Freq]
WinABI QueryPerformanceCounter, Ticks
mov r14, [Ticks] ; r10 - initial
CPUID
RDTSC
SHL RDX, 32
OR RAX, RDX
MOV R13, RAX ; R13 will hold initial Time Stamp counter value
align 16
L1:
RDTSCP
SHL RDX, 32
OR RAX, RDX
SUB RAX, R13 ; Subtract previous stamp
mov r12, rax ; R12 is the TSC difference
WinABI QueryPerformanceCounter, Ticks
mov r11, [Ticks] ; r10 - was initial
sub r11, r14
cmp r11, r15 ; Frequency, count one second
jle L1
movq xmm0, r12 ; R12 is now amount of TSC Ticks per second
movq xmm1, [Divider]
divsd xmm0, xmm1
WinABI FmtOut, MsgFmt, r12, xmm0 ; Float Point
jmp main
TerminateProgram
ENDPROGRAM
Output on Intel Xeon w5-2445 with Base Speed of 3,1 GHz:
>getbase.exe
TSC Ticks per 1 s = 3096153679; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095987294; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095986282; Base CPU Frequency is 3.10 GHz
TSC Ticks per 1 s = 3095985619; Base CPU Frequency is 3.10 GHz