我是openmp的新手,并编写了一些代码来找出这个并行的工作原理
#pragma omp parallel for
for (int i=1;i<=x;++i){
for (int j=1;j<=y;++j){
if (diameter < array[i][j]){
diameter = array[i][j];
}
}
}
这是我的问题
1:在这个结构中总有x y次迭代,omp会创建多少个线程来完成这项工作?是x y线程还是线程号受机器资源限制?
2:如果问题1的答案受到机器资源的限制,说我可以在32核机器上运行这个程序,是否意味着并行运行的最大线程是32?
3:用于私有和共享变量
- 3.1 x和y仅用于读取,有必要将它们设置为私有吗?
- 3.2直径同时读写。如果它是共享的,我想它可能会导致一些延迟,但如果它是私有的,我怎么能得到一个值的单一事实
答案 0 :(得分:0)
答案:
总共x次迭代不是x*y
次迭代,您应该添加collapse(2)
以进行x*y
次迭代:#pragma omp parallel for collapse(2)
omp将使用$ OMP_NUM_THREADS,它通常等于机器线程数,您可以通过以下方式更改它:Linux中的export OMP_NUM_THREADS= n_threads
或Windows中的set OMP_NUM_THREADS=n_threads
。但不建议设置它&gt;机器线程数。
见答案1.
x
和y
设置为私有。if(diameter<array[i][j]) {diameter=array[i][j]}
至diameter = max(diameter,array[i][j])
,然后使用缩减reduction(max:diameter)
计算直径代码必须如下所示:
#pragma omp parallel for collapse(2) reduction(max:diameter)
for (int i=1;i<=x;++i){
for (int j=1;j<=y;++j){
diameter = max(diameter,array[i][j]);
}
}