繁体   English   中英

在 C 中,在 64 位 CPU 上使用 64 位整数还是 16 位整数?

[英]In C Use 64 bit ints or 16 bit ints for performance on a 64 bit CPU?

在具有适当大小缓存的 64 位 CPU 上,这将导致 C 应用程序的性能更好,该应用程序使用许多相当大的 arrays 结构:使用 64 位整数,以便所有内容始终在 8 字节边界上对齐,这是 CPU 喜欢的,还是 16 位整数,以便缓存中有更多数组元素? 有没有人对这类问题进行过基准测试?

在主流 64 位处理器(即 x86-64 和 arm64)上,整数的大小对标量指令的性能有显着影响

但是,如果代码是矢量化的,通常最好使用尽可能小的类型,因为 SIMD 指令适用于固定大小的内部 SIMD 向量(SSE 为 128 位,AVX/AVX2 为 256 位,AVX-512 为 512 位,Neon 为 128 位)。 请注意,使用不同大小的类型可能会引入相当昂贵的转换或降低某些编译器有效向量化循环的能力(最近的主流优化编译器在这种情况下对代码进行向量化相对较好,尽管生成的代码通常不是最优的)。

关于缓存,arrays 和较小的 integer 项目可以从 memory 层次结构中更快地加载 事实上,L1/L2 缓存通常非常小,所以如果一个阵列可以放入这样的缓存中,那么对该阵列的访问将会更快(更低的延迟和更高的吞吐量)。 这种影响对于随机访问尤其明显。

关于alignment ,它通常不会对x86-64 平台产生重大影响,因为编译器和运行时可以很好地对齐 arrays 并且处理器经过优化以访问未对齐的数据(即使使用 SIMD 指令)。 例如, malloc / realloc返回 memory 地址在大多数 x86-64/arm64 平台上默认对齐为 16 字节。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM