请教大家一个感受:内存对齐

2016-02-29 18:17:22 +08:00
 glogo

Nginx 中有一个宏: ngx_align_ptr ,定义如下:
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
然后好奇的 google 了,发现这篇文章 http://oopschen.github.io/article/2013-09-01/cpu-cacheline.html
通过里面的例子发现对齐并没有效果那么明显.....

所有在这里向大伙儿请教下,使用了内存对齐给你的程序和工作带来了哪里飞一般的“感受”
(如能附上例子更好了~)

4336 次点击
所在节点    C
36 条回复
itfanr
2016-02-29 18:20:31 +08:00
mark
theoractice
2016-02-29 18:56:30 +08:00
矩阵乘法交换一下最后两个循环的顺序可以加速一倍以上。
然而其实最快的还是 blas 库。。。
imshawer
2016-02-29 19:23:54 +08:00
常识性知识点,很多计算机图书都会提到这一点,比如《深入理解计算机系统》。

X86/X64 如果没对齐会通过额外的 CPU 周期矫正,某些架构 CPU 也会直接异常,在语言高度发展的今天可能大多数程序员都不会注意这个问题。
glogo
2016-02-29 19:26:25 +08:00
@imshawer 蟹蟹,请问你在工作当中有遇到这类的问题吗
glogo
2016-02-29 19:34:48 +08:00
@imshawer 可以举例下异常的情况么
l6751902
2016-02-29 19:41:35 +08:00
...........估计将近 10 年没关心过这个问题了。。。。。大概原因是开发 /个人时间是越来越值钱,而计算资源是越来越廉价
imshawer
2016-02-29 19:44:13 +08:00
@glogo 常识嘛,写代码时注意就行了,比如 Itanium(IA-64) 架构貌似会直接异常,你可以查查。
redsonic
2016-02-29 19:48:35 +08:00
@glogo mips 架构的 cpu 要求内存必须对齐,否则运行时会触发 bus error ,将一些代码编译到 mips 的时候会经常遇到。另外内存不对齐的话对一二级 cache 开销也比较大,我觉得在 x86/64 平台上内存对齐属于深度优化的范围,一般的代码并不敏感。但有一些还是非常重要的,比如内核里频繁访问的结构体尤其是 hash 结构 优化不优化差别还是很大的。
ttycode
2016-02-29 20:03:16 +08:00
底层的接口,要么涉及到运算,要么涉及到 io ,才会这么明显。
lion9527
2016-02-29 20:46:24 +08:00
只记得以前写 C 的时候注意结构体里对齐,其他的就没用过了。我是菜鸟~
sujin190
2016-02-29 22:22:49 +08:00
其实还是没看懂这个怎么对其的,有人解释一下么?
sinxccc
2016-02-29 23:08:52 +08:00
尝试过往 MIPS 上移植代码的话就知道好处了…
eliteYang
2016-02-29 23:15:14 +08:00
我用对齐一般在网络通讯里,不对齐就会导致不同语言开发的收到的数据占用不正常,对不上
for4
2016-02-29 23:18:31 +08:00
glogo
2016-02-29 23:40:47 +08:00
@eliteYang 感谢,网络的例子我还没有遇到,可以分享下吗
sinxccc
2016-02-29 23:46:35 +08:00
@eliteYang 理论上来说除非是对性能要求非常极端,否则的话网络上传输的内容不应该跟平台的数据结构强耦合…
msg7086
2016-03-01 00:04:30 +08:00
这么说吧。很多 avx2 指令集根本不吃没对齐的数据。你不好好对齐直接崩一脸。
redsonic
2016-03-01 00:09:35 +08:00
@sinxccc 网络通信里面的对齐优化指的是底层代码中结构的 1 字节对齐,因为编译器会自动优化填充一些 padding ,使结构体里的每个成员按 4 字节或 8 字节对齐,结果接收端收到报文再放入结构的时候会错位。扒一下服务器的代码会看到附加 __attribute__ ((packed)) 属性的就是干这事的。
ershisi
2016-03-01 08:36:10 +08:00
做 c 底层开发,做 socket 的基本上都需要对齐。然后对结构体的大小有严格的认识。如果是做较为上层的东西,对齐是不需要你考虑的。另外,印象中对齐是在编译阶段进行的。(两年不做 c 开发了, c 基本快忘记了。。。)
linux40
2016-03-01 08:42:59 +08:00
。。。原来默认是不对齐的?我以为写个 struct 就自动给你对齐了,难道不是吗, c++不是有个 alignof 吗。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/259967

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX