繁体   English   中英

这是 OpenMP firstprivate 的正确使用吗?

[英]Is this the correct use of OpenMP firstprivate?

我需要并行化以下内容:

for(i=0; i<n/2; i++)
   a[i] = a[i+1] + a[2*i]

并行输出将与顺序输出不同,因为“读取”值将被“重写”。 为了获得顺序输出,然后并行化,我想利用 firstprivate(a)。 因为 firstprivate 给了每个步骤一个副本。

让我们想象一下 4 个线程和 100 个循环。

  • 1 --> i = 0 到 24
  • 2 --> i = 25 到 49
  • 3 --> i = 50 到 74
  • 4 --> i = 75 到 99

这意味着每个步将重写阵列的 25%。

当并行区域结束时,所有线程“合并”。 这是否意味着您得到的 a 与按顺序运行的结果相同?

#pragma omp parallel for firstprivate(a)
for(i=0; i<n/2; i++)
   a[i] = a[i+1] + a[2*i]

题:

  • 我的思维方式正确吗?
  • 代码是否以正确的方式并行化以获得顺序输出?

正如您所指出的,使用firstprivate为每个线程复制数据并不能真正帮助您取回数据。

最简单的解决方案实际上是将输入和输出分开并共享(默认)。

为了避免复制,最好在代码中使用新变量而不是 b 。 或者,您可以只使用指针并交换它们。

int out[100];
#pragma omp parallel for
for(i=0; i<n/2; i++)
   out[i] = a[i+1] + a[2*i]

// use out from here when you would have used a.

有没有简单的和通用的方式有传抄a为每个线程,然后再把它们合并。 lastprivate只是复制从线程执行最后一次迭代和一个不完整的输出数组reduction不知道从哪个数组采取哪些元素。 即使是这样,为每个线程复制整个数组也是一种浪费。 在这里共享输入/输出会更有效率。

暂无
暂无

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

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