2012-07-28 54 views
0

在高性能计算方面,我看到类似下面的代码:`cache_line_align_`的作用是什么?它有什么好处?

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_出现上面做什么?为什么它有用?

+1

我们做什么?我根本没有看到这种情况。如果没有看到它用来设置数组大小的宏,你根本就不能说它做了什么。提示:它用于确保结构在缓存行上对齐。 – Chad 2012-07-28 00:45:37

回答

2

使用多线程创建程序时,程序的两个部分可能会尝试访问共享内存系统中彼此紧邻的内存中的对象/原语。

不幸的是,如果计算机硬件都在同一个高速缓存行上,那么计算机硬件不能将一块内存提供给一个处理器,而将另一块计算机硬件提供给不同的处理器同时

这个陷阱被称为False Sharing

为了克服这个问题,我们可以在存储位置(变量)之间的缓冲区中添加一个空间。

该空间的缓冲区完全没有什么,除了在内存中分散我们期望的变量。

可能有一些非多线程程序已针对缓存性能进行了优化,您可以在其中看到一些类似的技巧,但在这种情况下,您通常需要将尽可能接近的变量尽可能靠近,以便它们都可以适合相同的缓存行。