繁体   English   中英

多个OpenMP线程读取(不写入)共享变量的性能成本?

[英]Performance cost to multiple OpenMP threads reading (not writing) a shared variable?

在OpenMP(我使用的是C ++)中,如果您有一个共享(甚至全局)变量被多个线程重复读取(而不是写入),会不会降低性能? 我知道,如果他们正在写变量,这将是不正确的。 我只问只读问题-如果多个线程重复读取同一个变量,是否会有潜在的性能成本?

如果该变量(更精确的内存位置)仅由所有线程读取,则从正确性和性能方面来说,您基本上都可以。 缓存协议具有“共享”状态-因此该值可以缓存在多个内核上。

但是,您还应该避免将数据写入变量所在的同一缓存行,因为这会使其他内核的缓存无效。 同样在NUMA系统上,您还必须考虑读取某些内核/线程的某些内存区域可能更昂贵。

如果您只是阅读,那么就没有安全问题。 一切都会正常。 根据定义,您没有竞赛条件 您无需进行任何锁定,因此不会发生高争用问题。 您可以使用Clang ThreadSanitizer在运行时测试线程安全性。

另一方面,还有一些性能问题需要注意。 通过使每个线程(最好是所有线程)一次访问一堆在内存中连续的数据,来避免错误共享 这样,当CPU缓存加载数据时,不需要每次都访问多次内存。 与访问CPU缓存相比,访问内存被认为非常昂贵(至少要慢几百倍)。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM