Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenMP共享与firstprivate性能对比_C++_Performance_Optimization_Openmp - Fatal编程技术网

C++ OpenMP共享与firstprivate性能对比

C++ OpenMP共享与firstprivate性能对比,c++,performance,optimization,openmp,C++,Performance,Optimization,Openmp,我在类方法中有一个#pragma omp parallel for循环。每个线程只读访问几个方法局部变量、几个调用私有数据和一个方法的参数。它们都在shared子句中声明。 我的问题是: 性能方面不应该有任何区别 变量shared或firstprivate。对吧? 如果我不小心使变量不共享同一缓存线,是否也是如此 如果其中一个共享变量是指针,并且在线程中我通过它读取了一个值,那么是否存在与普通循环类似的别名问题 明天我将尝试分析我的代码。同时,谢谢你的建议 嗯,它们不是一回事。使用share

我在类方法中有一个
#pragma omp parallel for
循环。每个线程只读访问几个方法局部变量、几个调用私有数据和一个方法的参数。它们都在
shared
子句中声明。 我的问题是:

  • 性能方面不应该有任何区别 变量
    shared
    firstprivate
    。对吧?
  • 如果我不小心使变量不共享同一缓存线,是否也是如此
  • 如果其中一个共享变量是指针,并且在线程中我通过它读取了一个值,那么是否存在与普通循环类似的别名问题
明天我将尝试分析我的代码。同时,谢谢你的建议

  • 嗯,它们不是一回事。使用
    shared
    ,它们在所有线程之间共享。使用
    firstprivate
    ,每个线程都会获得自己的副本。如果您只读取变量,那么最好将其保留为
    shared
    ,以避免复制它。(在C++中,FrestPrave将隐式调用复制构造函数)

  • 正确的,调用多个线程对位于同一缓存线上的值进行读写。缓存线将在访问缓存线的内核之间来回反弹,如果这种情况发生得足够频繁,可能会导致显著的速度减慢

  • 如果您只是通过共享指针读取数据,那么应该没有问题。但是如果你也写信给它,那么你需要确保你没有比赛条件


  • 仅读取变量时不会发生错误共享,这至少是我对现代处理器的理解。所以你的第二点是非常模糊的,我建议编辑你的答案,清楚地告诉OP不会受到虚假分享的影响,不应该在意它。