当访问特定变量的开销似乎特别高时,通常会检测到伪共享。在执行应用程序时,对占据主导地位的并行循环进行仔细分析即可揭示伪共享造成的性能可伸缩性问题。
通常,可以使用以下方法减少伪共享:
尽可能使用专用或线程专用数据。
利用编译器的优化功能来消除内存负载和存储。
填充数据结构,以使每个线程的数据都驻留在不同的缓存代码行上。填充的大小取决于系统,等于将线程的数据推入到另一缓存代码行所需的大小。
修改数据结构,以减少线程之间的数据共享。
处理伪共享的方法与特定应用程序紧密相关。在某些情况下,更改数据的分配方式可以减少伪共享。在其他情况下,通过更改迭代到线程的映射,为每个块中的每个线程分配更多的工作(通过更改 chunk_size 值),也可以减少伪共享。