【发布时间】:2020-09-28 20:30:13
【问题描述】:
我需要并行化以下内容:
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]
问题:
- 我的思维方式正确吗?
- 代码是否以正确的方式并行化以获得顺序输出?
【问题讨论】:
-
a是什么类型? (此信息对于正确回答您的问题至关重要)。 -
@Zulan 感谢您的努力。它是用整数填充的 C 中的数组?这些信息是否足够?
-
所以具体是
int a[100]?因为这与int* a的处理方式不同。 -
是的,int a[100];。我应该将其包含在代码示例中。我通过制作数组 a 的副本 b 并使用 b 来“读取”并让“重写”发生在 a 中来“修复”它。但在我看来,这不是一个巧妙的解决方案。
标签: c++ c parallel-processing openmp