在openmp中读取数据时是否会发生错误共享?

时间:2017-07-06 09:23:47

标签: c++ openmp false-sharing

如果我有一个带有OpenMP并行化的C ++程序,其中不同的线程经常只使用一些小的共享数组来从中读取数据,在这种情况下是否会发生错误共享?换句话说,假共享只与内存写操作有关,或者也可能在内存读操作时发生。

2 个答案:

答案 0 :(得分:5)

通常使用的缓存一致性协议,例如MESI(已修改,独占,共享,无效),具有称为“共享”的缓存行的特定状态。如果缓存行由多个处理器读取,则它们处于此状态。然后,每个处理器都有一个缓存行的副本,可以安全地从中读取而不会进行错误共享。在写入时,通知所有处理器使高速缓存行无效,这是导致错误共享的主要原因

答案 1 :(得分:4)

虚假共享是一个性能问题,因为它会导致缓存行的额外移动,这需要时间。当两个不真正共享的变量驻留在同一行中并且单独的线程更新每个变量时,该行必须在机器周围反弹,这增加了每次访问的延迟。在这种情况下,如果变量在单独的行中,则每个线程将保留一个本地修改的副本"其"行,不需要数据移动。

但是,如果您没有更新某一行,那么就不需要数据移动,并且除了您可能已经能够拥有每个线程所需的数据而不是数据之外,共享不会对性能产生影响它没有。这是一个小的,二阶的效果。虽然。所以除非你知道你的缓存容量有限,否则忽略它!