如果我有一个具有 OpenMP 并行化的 C++ 程序,其中不同的线程不断使用一些小的共享数组仅用于从中读取数据,在这种情况下是否会发生错误共享?换句话说,错误共享仅与内存写入操作有关,或者它也可能发生在内存读取操作中。
问问题
1163 次
2 回答
5
通常使用的缓存一致性协议,例如MESI(修改、独占、共享、无效),具有称为“共享”的缓存行的特定状态。如果缓存线被多个处理器读取,则它们处于此状态。然后每个处理器都有一个缓存行的副本,并且可以安全地从中读取,而不会发生错误共享。在写入时,通知所有处理器使高速缓存行无效,这是错误共享的主要原因
于 2017-07-06T09:31:05.820 回答
4
错误共享是一个性能问题,因为它会导致需要时间的缓存行的额外移动。当两个没有真正共享的变量位于同一行并且单独的线程更新它们中的每一个时,该行必须在机器周围反弹,这增加了每次访问的延迟。在这种情况下,如果变量位于不同的行中,每个线程将保留“其”行的本地修改副本,并且不需要数据移动。
但是,如果您不更新行,则不需要移动数据,并且共享不会对性能产生影响,除了您可能已经能够在其中拥有每个线程确实需要的数据,而不是它不需要的数据'吨。这是一个很小的二阶效应。尽管。因此,除非您知道自己的缓存容量有限,否则请忽略它!
于 2017-07-06T10:46:37.680 回答