Wie wichtig ist die Funktionsausrichtung bei modernen Prozessoren?
Wenn ich C-Code mit einem aktuellen Compiler auf einem amd64- oder x86-System kompiliere, werden Funktionen auf ein Vielfaches von 16 Byte ausgerichtet. Wie wichtig ist diese Ausrichtung für moderne Prozessoren? Gibt es eine enorme Leistungseinbuße beim Aufrufen einer nicht ausgerichteten Funktion?
BenchmarkIch habe das folgende Mikrobenchmark (call.S
):
// benchmarking performance penalty of function alignment.
#include <sys/syscall.h>
#ifndef SKIP
# error "SKIP undefined"
#endif
#define COUNT 1073741824
.globl _start
.type _start,@function
_start: mov $COUNT,%rcx
0: call test
dec %rcx
jnz 0b
mov $SYS_exit,%rax
xor %edi,%edi
syscall
.size _start,.-_start
.align 16
.space SKIP
test: nop
rep
ret
.size test,.-test
mit folgendem Shell-Skript:
#!/bin/sh
for i in `seq 0 15` ; do
echo SKIP=$i
cc -c -DSKIP=$i call.S
ld -o call call.o
time -p ./call
done
Auf einer CPU, die sich als identifiziertIntel (R) Core (TM) i7-2760QM-CPU bei 2,40 GHz gemäß/proc/cpuinfo
. Der Offset machte für mich keinen Unterschied, der Benchmark benötigte konstant 1,9 Sekunden.
Andererseits auf einem anderen System mit einer CPU, die sich selbst alsIntel (R) Core (TM) i7-CPU L 640 bei 2,13 GHzDer Benchmark dauert 6,3 Sekunden, es sei denn, Sie haben einen Versatz von 14 oder 15, bei dem der Code 7,2 Sekunden dauert. Ich denke, das liegt daran, dass die Funktion mehrere Cache-Zeilen umfasst.