我是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 直径同时读写。 如果它是共享的,我想它可能会导致一些延迟,但如果它是私有的,我怎么能得到一个值的单一真相
答案:
-
总共有x次迭代而不是
x*y
次迭代,您应该添加collapse(2)
以使其x*y
迭代:#pragma omp parallel for collapse(2)
OMP会用到$OMP_NUM_THREADS,一般等于机器线程数,可以改为:
export OMP_NUM_THREADS= n_threads
Linux或Windowsset OMP_NUM_THREADS=n_threads
,但不建议>机器线程数进行设置。 -
请参阅答案 1。
-
- 如果
y
和if(diameter<array[i][j]) {diameter=array[i][j]}
是在循环外部声明的,则不必将它们设置为私有。 - 不能将直径设置为私有或共享。我认为您应该将代码从:
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]);
}
}