如果我有一个OpenMP并行化的C++程序,其中不同的线程不断地使用一些小的共享数组,只为读取数据,在这种情况下会发生错误共享吗?换句话说,错误共享只涉及内存写入操作,或者也可能发生在内存读取操作中。在openmp中读取数据时是否发生错误共享?
1
A
回答
2
通常使用的缓存一致性协议(如MESI(修改,排他,共享,无效))对称为“共享”的缓存行具有特定状态。如果多个处理器读取高速缓存行,则处于这种状态。每个处理器都有一个高速缓存行的副本,并且可以安全地从中读取,而不会发生虚假共享。在写入时,通知所有处理器使作为虚假共享的主要原因的缓存线无效
3
虚假共享是一个性能问题,因为它会导致需要时间的缓存行的额外移动。当两个并不真正共享的变量驻留在同一行中并且单独的线程更新每个变量时,线必须在机器周围反弹,这会增加每个访问的延迟。在这种情况下,如果变量位于不同的行中,则每个线程将保留“其”行的本地修改副本,并且不需要数据移动。
但是,如果您没有更新某行,则不需要进行数据移动,并且分享对性能没有影响,除了您可能已经能够获得每个线程确实需要的数据,而不是它没有的数据。这是一个小的,次要的效果。虽然。所以除非你知道你的缓存容量有限,否则忽略它!
相关问题
- 1. OpenMP共享数据
- 2. 在Firefox中读取单选按钮值时发生jQuery错误,但在Safari中未读取时发生错误
- 3. 如果您只读取共享数据,是否存在数据竞争?
- 4. 并发读写OpenMp中的共享变量
- 5. C和OpenMP的:指向共享只读数据减慢执行
- 6. Java从MySql数据库读取时发生PreparedStatement错误
- 7. Xamarin.forms共享项目在创建时发生错误
- 8. OpenMP的错误:“X”是预先确定的“共享”的“私人”
- 9. OpenMP虚假共享
- 10. 在OpenMP共享阵列
- 11. OpenMP中的共享向量
- 12. 在Android中从包裹中读取时发生错误
- 13. 创建共享库时发生铛声错误
- 14. Multipule帖子给出:OAuthException ::(#1)时发生错误,创建共享
- 15. (OAuthException - #1)(#1)创建共享时发生错误
- 16. 编译共享库时发生Knitr和Rcpp错误1
- 17. 从Firebase读取数据时发生UnrecognizedPropertyException
- 18. 在Coldfusion中读取ms-excel文件时发生错误
- 19. 在Excel中读取空白单元格时发生错误
- 20. 发送数据时发生ElasticSearch错误
- 21. 发送数据时发生curl错误
- 22. Git对等共享 - 致命:读取错误:无效参数
- 23. 是否有共享指针,可以从中窃取数据?
- 24. 使用VB.NET在Paint中编辑图像时发生“共享冲突”错误
- 25. 尝试在共享内存中写入时发生总线错误
- 26. 错误从共享数据库计划
- 27. OpenMP几个“共享” - 指令?
- 28. OpenMP:减少和共享
- 29. 使用mmap从共享内存中读取 - 分割错误
- 30. 使用Apache poi从Excel读取数据后发生java.lang.NullPointerException错误
afaik错误分享是关于不必更改数据的不必要的重新加载,因为它与确实发生更改的数据在同一页面上。如果什么都没有写,那么就没有必要重新加载任何东西,因此没有虚假的共享 – user463035818
在这里看到:https://en.wikipedia.org/wiki/False_sharing – user463035818
我想到了假分享的情况下,当几个线程工作使用相同的缓存行,处理器必须同步它们才能维持一致性,如此处所述http://www.drdobbs.com/architecture-and-design/sharing-is-the-root-of-all-contention/214100002 –