在高性能计算环境中,我看到了如下代码:
typedef union
{
erts_smp_rwmtx_t rwmtx;
byte cache_line_align_[ERTS_ALC_CACHE_LINE_ALIGN_SIZE(sizeof(erts_smp_rwmtx_t))];
}erts_meta_main_tab_lock_t;
erts_meta_main_tab_lock_t main_tab_lock[16];
上面出现的cache_line_align_
有什么作用?为什么有用?
答案 0 :(得分:2)
使用多线程创建程序时,程序的两个部分可能会尝试访问共享内存系统中彼此相邻的内存中的对象/基元。
不幸的是,如果两块存储器位于同一个缓存线上,则计算机硬件无法将一块内存提供给一个处理器而另一块处理器同时提供给另一台处理器 。
这个陷阱被称为False Sharing。
为了克服这个问题,我们可以在相关的内存位置(变量)之间添加一个空间缓冲区。
除了在内存中分散我们想要的变量外,那个空间缓冲区绝对没有任何作用。
可能有一些非多线程程序已针对缓存性能进行了优化,您可以在其中看到一些类似的技巧,但在这种情况下,您通常希望尽可能靠近的变量尽可能接近,以便它们都适合在相同的缓存行上。