繁体   English   中英

OpenMP (C++) 中共享和私有的区别

[英]Differences between Shared and Private in OpenMP (C++)

我正在尝试使用 OpenMP 并行化我的 C++ 代码。

所以这是我第一次使用 OpenMP,我有几个关于如何正确使用私有/共享的问题

下面只是我为了解发生了什么而编写的示例代码。 如果我错了,请纠正我。

#pragma omp parallel for
for (int x=0;x<100;x++)
{
    for (int y=0;y<100;y++)
    {
        for (int z=0;z<100;z++)
        {
             a[x][y][z]=U[x]+U[y]+U[z]; 
        }
    }
}

因此,通过使用#pragma omp parallel for我可以使用多个线程来执行此循环,即使用 5 个线程,#1 线程使用 0<=x<20,#2 线程使用 20<=x<40...80 <=x <100。

并且每个线程同时运行。 所以通过使用它,我可以使这段代码更快。

由于xyz在循环内声明,它们是私有的(每个线程都有这些变量的副本), aU是共享的。

所以每个线程读取一个共享变量U并写入一个共享变量a

我有一些问题。

  1. #pragma omp parallel for#pragma omp parallel for private(y,z)有什么区别? 我认为由于xyz已经是私有的,它们应该是相同的。

  2. 如果我将#pragma omp parallel for private(a, U) ,这是否意味着每个线程都会有aU的副本?

例如,对于具有aU副本的 2 个线程,线程 #1 使用 0<=x<50 以便它从a[0][0][0]写入a[49][99][99]和线程 #2 从a[50][0][0]写入a[99][99][99] 然后他们合并这两个结果,以便他们拥有完整版本的a[x][y][z]

在并行块中声明的任何变量都是私有的。 并行指令的private子句中提到的变量遵循变量的正常规则:变量必须在使用时已经声明。

private的作用是为每个线程创建一个变量的副本。 然后线程可以更新该值,而不必担心其他线程可能进行的更改。 在并行块的末尾,除非并行指令中包含其他子句,否则这些值通常会丢失。 reduction指令是最常见的,因为它可以将每个线程的结果组合成循环的最终结果。

暂无
暂无

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

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