0

在高性能计算环境中,我看到如下代码:

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_出现是做什么的?为什么有用?

4

1 回答 1

2

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

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

这个陷阱被称为虚假共享

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

除了将我们想要的变量分散在内存中之外,该空间缓冲区绝对没有任何作用。

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

于 2012-07-28T01:13:30.103 回答