[英]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。
并且每个线程同时运行。 所以通过使用它,我可以使这段代码更快。
由于x
、 y
和z
在循环内声明,它们是私有的(每个线程都有这些变量的副本), a
和U
是共享的。
所以每个线程读取一个共享变量U
并写入一个共享变量a
。
我有一些问题。
#pragma omp parallel for
和#pragma omp parallel for private(y,z)
有什么区别? 我认为由于x
、 y
和z
已经是私有的,它们应该是相同的。
如果我将#pragma omp parallel for private(a, U)
,这是否意味着每个线程都会有a
和U
的副本?
例如,对于具有a
和U
副本的 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.