[英]openMP lastprivate and firstprivate to the same variable
[英]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 个循环。
这意味着每个步将重写阵列的 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.