openmp并行工作机制

时间:2017-08-23 01:21:40

标签: multithreading for-loop parallel-processing openmp

我是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直径同时读写。如果它是共享的,我想它可能会导致一些延迟,但如果它是私有的,我怎么能得到一个值的单一事实

1 个答案:

答案 0 :(得分:0)

答案:

  1. 总共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;机器线程数。

  2. 见答案1.

    1. 如果在循环外声明它们,则不必将xy设置为私有。
    2. 您不能将直径设置为私有或共享。我认为你应该改变你的代码: if(diameter<array[i][j]) {diameter=array[i][j]}diameter = max(diameter,array[i][j]),然后使用缩减reduction(max:diameter)计算直径
  3. 代码必须如下所示:

    #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]);
            }
        }