OpenMP:并行(i;…)和i值
OpenMP: parallel for(i;...) and i value
我有以下并行代码片段:
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(4);
int i;
#pragma omp parallel private(i)
{
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %dn", omp_get_thread_num(),i);
}
#pragma omp critical
printf("i %d: %dn", omp_get_thread_num(), i );
}
}
我认为在循环之后,每个线程的i
将等于该线程循环中i
的最后一个值。我希望的输出是:
A 0: 0
A 0: 1
A 0: 2
A 3: 9
A 2: 6
A 2: 7
A 2: 8
A 1: 3
A 1: 4
A 1: 5
i 0: 3
i 3: 10
i 2: 9
i 1: 6
而我得到的是
A 0: 0
A 0: 1
A 0: 2
A 3: 9
A 2: 6
A 2: 7
A 2: 8
A 1: 3
A 1: 4
A 1: 5
i 0: -1217085452
i 3: -1217085452
i 2: -1217085452
i 1: -1217085452
如何使i
保持上次迭代的值?lastprivate(i)
使i = 10
为所有线程,这不是我想要的。
事实证明你不能。OpenMP改变了程序语义。
编译器根据一组定义良好的规则重写并行for循环。
这也意味着您不能从这样的循环中中断或返回。您也可以不直接操作循环变量。循环条件不能调用随机函数或执行任何条件表达式,简而言之: omp parallel for
循环是而不是 for循环
#include <omp.h>
#include "stdio.h"
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
int i;
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %dn", omp_get_thread_num(),i);
}
#pragma omp critical
printf("i %d: %dn", omp_get_thread_num(), i );
}
}
多亏了sehe的帖子,我想出了下面的肮脏技巧来解决这个问题
int i, last_i;
#pragma omp parallel private(i)
{
#pragma omp for
for(i = 0;i < 10; i++) {
printf("A %d: %dn", omp_get_thread_num(),i);
last_i = i;
}
#pragma omp critical
printf("i %d: %dn", omp_get_thread_num(), last_i );
}
}
相关文章:
- OpenMP:并行更新数组总是需要减少数组吗
- 如何使用OpenMP并行这两个循环
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用OpenMP使这个循环并行
- 为什么 openmp 的并行不适用于矢量化色彩空间转换?
- 在C++中使用并行化的预期速度是多少(不是 OpenMp,而是 <thread>)
- OpenMP 与有序和关键指令并行
- OpenMP for 循环并行性问题
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 如何使用 OpenMP 并行化最近邻搜索
- 并行块(线程清理器)之外的 OpenMP 中的争用条件;误报?
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- 如何使用 OpenMP 正确并行化 for 循环?
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- OpenMP并行发送哪些元素
- 对于openMP来说,有什么建议可以将以下代码与openMP并行
- 使用openmp实现并行广度优先搜索
- 是否可以使用OpenMP并行化一个列表,该列表可以在每次迭代中添加新元素
- std::lock_guard 在 OpenMP 并行中
- 并行OpenMP缩减vs.函数定义