工作机制的 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:在这个结构中总共有 xy 次迭代,OMP 会创建多少个线程来完成这项工作?是 xy 个线程还是线程数受计算机资源限制?

2:如果问题 1 的答案受机器资源的限制,假设我可以在 32 核机器上运行这个程序,这是否意味着可以并行运行的最大线程是 32?

3:对于私有变量和共享变量

-- 3.1 X 和 Y 只用于读取,有必要将它们设置为私有吗?

--3.2 直径同时读写。 如果它是共享的,我想它可能会导致一些延迟,但如果它是私有的,我怎么能得到一个值的单一真相

答案:

  1. 总共有x次迭代而不是x*y次迭代,您应该添加collapse(2)以使其x*y迭代:#pragma omp parallel for collapse(2)

    OMP会用到$OMP_NUM_THREADS,一般等于机器线程数,可以改为:export OMP_NUM_THREADS= n_threadsLinux或Windowsset OMP_NUM_THREADS=n_threads,但不建议>机器线程数进行设置。

  2. 请参阅答案 1。

    1. 如果yif(diameter<array[i][j]) {diameter=array[i][j]}是在循环外部声明的,则不必将它们设置为私有。
    2. 不能将直径设置为私有或共享。我认为您应该将代码从:diameter = max(diameter,array[i][j])reduction(max:diameter),然后使用减速CC_12计算直径

代码必须如下所示:

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

最新更新