2017-07-06 112 views
1

如果我有一个OpenMP并行化的C++程序,其中不同的线程不断地使用一些小的共享数组,只为读取数据,在这种情况下会发生错误共享吗?换句话说,错误共享只涉及内存写入操作,或者也可能发生在内存读取操作中。在openmp中读取数据时是否发生错误共享?

+0

afaik错误分享是关于不必更改数据的不必要的重新加载,因为它与确实发生更改的数据在同一页面上。如果什么都没有写,那么就没有必要重新加载任何东西,因此没有虚假的共享 – user463035818

+0

在这里看到:https://en.wikipedia.org/wiki/False_sharing – user463035818

+0

我想到了假分享的情况下,当几个线程工作使用相同的缓存行,处理器必须同步它们才能维持一致性,如此处所述http://www.drdobbs.com/architecture-and-design/sharing-is-the-root-of-all-contention/214100002 –

回答

2

通常使用的缓存一致性协议(如MESI(修改,排他,共享,无效))对称为“共享”的缓存行具有特定状态。如果多个处理器读取高速缓存行,则处于这种状态。每个处理器都有一个高速缓存行的副本,并且可以安全地从中读取,而不会发生虚假共享。在写入时,通知所有处理器使作为虚假共享的主要原因的缓存线无效

+0

这是否意味着如果为每个线程创建此数组的本地副本,那么将不会有性能增益? –

+1

这取决于实际的底层硬件,但我认为不会有性能提升。我建议写一个微基准 – max

+1

我想过了一点。由于缓存使用率更高,复制数据可能会更糟糕。大多数情况下,只有小型一级缓存是核心私有的。通过包含缓存,您可以在更高级别的缓存中获得冗余数据。 – max

3

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

但是,如果您没有更新某行,则不需要进行数据移动,并且分享对性能没有影响,除了您可能已经能够获得每个线程确实需要的数据,而不是它没有的数据。这是一个小的,次要的效果。虽然。所以除非你知道你的缓存容量有限,否则忽略它!

相关问题