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

时间:2017-08-06 21:19:03

标签: c++ multithreading performance openmp

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果您只是阅读,那么您没有安全问题。一切都会好起来的。根据定义,您没有Race Conditions。您不需要进行任何锁定,因此不会发生high-contention个问题。您可以使用Clang ThreadSanitizer在运行时测试线程安全性。

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

祝你好运!