Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

8.2.1 什么是伪共享?

在大多数共享内存多处理器计算机中,每个处理器都有自己的本地高速缓存。高速缓存充当着慢速内存与处理器的高速寄存器之间的缓冲区。访问内存位置时,会使包含所请求内存位置的一部分实际内存(缓存代码行)被复制到高速缓存中。对同一内存位置或其周围位置的后续引用将在高速缓存外满足,直至系统决定有必要在高速缓存和内存之间保持一致性。

当不同处理器上的线程修改驻留在同一缓存代码行上的变量时,就会发生伪共享。这种情况称为伪共享(与真正意义上的共享加以区分),因为线程并没有访问相同的变量,而是访问正好驻留在同一缓存代码行上的不同变量。

当线程修改其高速缓存中的变量时,该变量所在的整个缓存代码行将被标为无效。如果另一个线程尝试访问同一缓存代码行上的变量,则修改后的缓存代码行将写回到内存,线程将从内存中获取缓存代码行。这是因为基于缓存代码行保持高速缓存一致性,而不是针对单个变量或元素。发生伪共享后,线程将被强制从内存中获取缓存代码行的最新副本,即使它尝试访问的变量并未修改。

如果经常发生伪共享,互连流量将增加,而 OpenMP 应用程序的性能和可伸缩性则会显著下降。在出现以下所有情况时,伪共享会使性能下降。

  • 多个线程修改共享数据

  • 多个线程修改同一缓存代码行中的数据

  • 数据修改频率非常高(如在紧凑循环中)

请注意,访问只读共享数据不会发生伪共享。