Eu tenho duas máquinas:
1) 2 x E5-2620 v3 @ 2.40GHz (microcódigo: 0x3c 2018-01-19), 8GB de RAM (CentOS 7 w / 4.11 kernel)
2) 2 x E5-2630 v3 @ 2.40GHz (microcódigo: 0x3c 2018-01-19), 64GB de RAM (Fedora 22 w / 4.11 kernel)
Os kernels são compilados sob encomenda, mas sem modificação. O .config
para ambas as compilações é exatamente o mesmo (e também não tem kpti
desde que foi introduzido em 4,14 iirc).
Eu escrevi um código como:
beg = rdtsc_beg();
for (i = 0; i < 1000000; ++i)
{
syscall(512); //ENOSYS
}
end = rdtsc_end();
printf("syscall: %lu cycles\n", (end - beg) / 1000000);
para medir o custo de um syscall. Eu recebo 99 ciclos na máquina 1 e 264 ciclos na máquina 2.
Eu não consigo entender por que existe uma diferença tão grande dada a quase qualquer coisa que eu acho que seja relevante sendo a mesma coisa.
Alguma idéia do que poderia estar causando a diferença ou alguma pista em que eu deveria estar procurando descobrir a causa?
Editar:
Eu mudei o código para:
volatile int ret = 0;
beg = rdtsc_beg();
for (i = 0; i < 1000000; ++i)
{
ret++;
}
end = rdtsc_end();
printf("inc: %lu cycles\n", (end - beg) / 1000000);
e compilado estaticamente:
400a3f: 0f a2 cpuid
400a41: 0f 31 rdtsc
400a43: 89 d6 mov %edx,%esi
400a45: 89 c7 mov %eax,%edi
400a47: 48 c1 e6 20 shl $0x20,%rsi
400a4b: 89 ff mov %edi,%edi
400a4d: b8 80 96 98 00 mov $0xf4240,%eax
400a52: 48 09 fe or %rdi,%rsi
400a55: 0f 1f 00 nopl (%rax)
400a58: 8b 54 24 0c mov 0xc(%rsp),%edx
400a5c: 83 c2 01 add $0x1,%edx
400a5f: 48 83 e8 01 sub $0x1,%rax
400a63: 89 54 24 0c mov %edx,0xc(%rsp)
400a67: 75 ef jne 400a58 <main+0x28>
400a69: 0f 01 f9 rdtscp
400a6c: 41 89 d0 mov %edx,%r8d
400a6f: 89 c7 mov %eax,%edi
400a71: 0f a2 cpuid
O resultado é 5 ciclos na Máquina 1 e 14 ciclos na Máquina 2.