gpt4 book ai didi

performance - 功能对齐在现代处理器上究竟有多重要?

转载 作者:行者123 更新时间:2023-12-04 03:05:28 25 4
gpt4 key购买 nike

当我在 amd64 或 x86 系统上使用最新的编译器编译 C 代码时,函数会对齐到 16 字节的倍数。这种对齐对现代处理器的实际影响有多大?调用未对齐的函数会带来巨大的性能损失吗?
基准
我运行了以下微基准测试( 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
使用以下 shell 脚本:
#!/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
在根据 /proc/cpuinfo 将自身标识为 Intel(R) Core(TM) i7-2760QM CPU @ 2.40GHz 的 CPU 上| .偏移量对我没有任何影响,基准测试持续运行 1.9 秒。
另一方面,在另一个 CPU 报告自己为 Intel(R) Core(TM) i7 CPU L 640 @ 2.13GHz 的系统上,基准测试需要 6.3 秒,除非您有 14 或 15 的偏移,其中代码需要 7.2 秒。我认为这是因为该函数开始跨越多个缓存行。

最佳答案

TL;博士 : 缓存对齐很重要。您不想要不会执行的字节。

您至少希望避免在您将执行的第一个指令之前获取指令。由于这是一个微基准测试,您很可能看不到任何差异,但想象一下在一个完整的程序中,如果由于第一个字节未与缓存对齐而在一堆函数上有额外的缓存未命中-行,您最终必须为函数的最后 N 个字节获取一个新的缓存行(其中 N <= 您缓存但未使用的函数之前的字节数)。

Intel's optimization manual说这个:

3.4.1.5 Code Alignment

Careful arrangement of code can enhance cache and memory locality. Likely sequences of basic blocks should be laid out contiguously in memory. This may involve removing unlikely code, such as code to handle error conditions, from the sequence. See Section 3.7, “Prefetching,” on optimizing the instruction prefetcher.

3-8 Assembly/Compiler Coding Rule 12. (M impact, H generality) All branch targets should be 16- byte aligned.

Assembly/Compiler Coding Rule 13. (M impact, H generality) If the body of a conditional is not likely to be executed, it should be placed in another part of the program. If it is highly unlikely to be executed and code locality is an issue, it should be placed on a different code page.



它还有助于解释为什么您没有注意到程序中的任何差异。所有代码都被缓存一次并且永远不会离开缓存(当然是模上下文切换)。

关于performance - 功能对齐在现代处理器上究竟有多重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22235236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com