openmp读取数据时会出现虚假共享吗?
does false sharing occur when data is read in openmp?
如果我有一个带有 OpenMP 并行化的 C++ 程序,其中不同的线程不断地使用一些小的共享数组只是为了 从中读取 数据,在这种情况下是否会发生虚假共享?换句话说,错误共享仅与内存写入操作有关,还是也可能发生在内存读取操作中。
通常使用的缓存一致性协议,例如 MESI(修改、独占、共享、无效),具有称为 "shared" 的特定缓存行状态。如果缓存行被多个处理器读取,则缓存行处于此状态。然后每个处理器都有一个缓存行的副本,并且可以安全地从中读取而不会出现错误共享。在写入时,所有处理器都被通知使缓存行无效,这是错误共享的主要原因
错误共享是一个性能问题,因为它会导致高速缓存行的额外移动,这需要时间。当两个不是真正共享的变量位于同一行并且单独的线程更新它们中的每一个时,该行必须在机器周围反弹,这增加了每次访问的延迟。在这种情况下,如果变量位于单独的行中,每个线程将保留 "its" 行的本地修改副本,并且不需要数据移动。
但是,如果您不更新行,则不需要移动数据,并且共享不会对性能产生影响,事实上您可能已经能够在其中拥有每个线程确实需要的数据,比它没有的数据。这是一个小的二阶效应。尽管。所以除非你知道你的缓存容量有限,否则请忽略它!
如果我有一个带有 OpenMP 并行化的 C++ 程序,其中不同的线程不断地使用一些小的共享数组只是为了 从中读取 数据,在这种情况下是否会发生虚假共享?换句话说,错误共享仅与内存写入操作有关,还是也可能发生在内存读取操作中。
通常使用的缓存一致性协议,例如 MESI(修改、独占、共享、无效),具有称为 "shared" 的特定缓存行状态。如果缓存行被多个处理器读取,则缓存行处于此状态。然后每个处理器都有一个缓存行的副本,并且可以安全地从中读取而不会出现错误共享。在写入时,所有处理器都被通知使缓存行无效,这是错误共享的主要原因
错误共享是一个性能问题,因为它会导致高速缓存行的额外移动,这需要时间。当两个不是真正共享的变量位于同一行并且单独的线程更新它们中的每一个时,该行必须在机器周围反弹,这增加了每次访问的延迟。在这种情况下,如果变量位于单独的行中,每个线程将保留 "its" 行的本地修改副本,并且不需要数据移动。
但是,如果您不更新行,则不需要移动数据,并且共享不会对性能产生影响,事实上您可能已经能够在其中拥有每个线程确实需要的数据,比它没有的数据。这是一个小的二阶效应。尽管。所以除非你知道你的缓存容量有限,否则请忽略它!