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?

Benchmark

Ich 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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage