不了解使用最大操作 OpenMP 程序进行并行缩减的输出?
Didn't understand the output from parallel reduction using max operation OpenMP program?
我在阅读有关并行编程的内容时遇到了这段基本代码。
这是使用最大操作的并行归约程序。我们对这次行动的期望是什么?
#include <stdio.h>
#include <omp.h>
int main() {
double arr[10];
omp_set_num_threads(4);
double max_val = 0.0;
int i;
for (i = 0; i < 10; i++)
arr[i] = 2.0 + i;
#pragma omp parallel
for reduction(max: max_val)
for (i = 0; i < 10; i++) {
printf("thread id = %d and i = %d \n", omp_get_thread_num(), i);
if (arr[i] > max_val) {
max_val = arr[i];
}
}
printf("\nmax_val = %f", max_val);
}
这是输出
thread id = 2 and i = 6
thread id = 2 and i = 7
thread id = 1 and i = 3
thread id = 1 and i = 4
thread id = 1 and i = 5
thread id = 3 and i = 8
thread id = 3 and i = 9
thread id = 0 and i = 0
thread id = 0 and i = 1
thread id = 0 and i = 2
max_val = 11.000000
我是 openmp 新手。请帮助我理解这段代码。我没有得到这个输出。这个结果是怎么来的?
您的代码填写 arr
:
int i;
for (i = 0; i < 10; i++)
arr[i] = 2.0 + i;
值来自 2 to 11
:
然后在并行循环中:
#pragma omp parallel for reduction(max: max_val)
for (i = 0; i < 10; i++) {
printf("thread id = %d and i = %d \n", omp_get_thread_num(), i);
if (arr[i] > max_val) {
max_val = arr[i];
}
}
当 OpenMP 读取时 #pragma omp parallel for
OpenMP 会将团队中的循环迭代划分为线程,在您的情况下为 4 个线程:
omp_set_num_threads(4);
可以找到关于 #pragma omp parallel
和 #pragma omp parallel for
的更详细的答案 。
使用 reduction(max: max_val)
OpenMP 将创建变量 max_val
per 线程的副本,并且在并行区域之后原始变量 max_val
将等于所有线程中最大的max_val
。在你的情况下是 11.0
.
可以找到关于减少条款的更详细的答案。
函数 omp_get_thread_num()
returns 返回调用该方法的线程的 ID。
我在阅读有关并行编程的内容时遇到了这段基本代码。 这是使用最大操作的并行归约程序。我们对这次行动的期望是什么?
#include <stdio.h>
#include <omp.h>
int main() {
double arr[10];
omp_set_num_threads(4);
double max_val = 0.0;
int i;
for (i = 0; i < 10; i++)
arr[i] = 2.0 + i;
#pragma omp parallel
for reduction(max: max_val)
for (i = 0; i < 10; i++) {
printf("thread id = %d and i = %d \n", omp_get_thread_num(), i);
if (arr[i] > max_val) {
max_val = arr[i];
}
}
printf("\nmax_val = %f", max_val);
}
这是输出
thread id = 2 and i = 6
thread id = 2 and i = 7
thread id = 1 and i = 3
thread id = 1 and i = 4
thread id = 1 and i = 5
thread id = 3 and i = 8
thread id = 3 and i = 9
thread id = 0 and i = 0
thread id = 0 and i = 1
thread id = 0 and i = 2
max_val = 11.000000
我是 openmp 新手。请帮助我理解这段代码。我没有得到这个输出。这个结果是怎么来的?
您的代码填写 arr
:
int i;
for (i = 0; i < 10; i++)
arr[i] = 2.0 + i;
值来自 2 to 11
:
然后在并行循环中:
#pragma omp parallel for reduction(max: max_val)
for (i = 0; i < 10; i++) {
printf("thread id = %d and i = %d \n", omp_get_thread_num(), i);
if (arr[i] > max_val) {
max_val = arr[i];
}
}
当 OpenMP 读取时 #pragma omp parallel for
OpenMP 会将团队中的循环迭代划分为线程,在您的情况下为 4 个线程:
omp_set_num_threads(4);
可以找到关于 #pragma omp parallel
和 #pragma omp parallel for
的更详细的答案
使用 reduction(max: max_val)
OpenMP 将创建变量 max_val
per 线程的副本,并且在并行区域之后原始变量 max_val
将等于所有线程中最大的max_val
。在你的情况下是 11.0
.
可以找到关于减少条款的更详细的答案
函数 omp_get_thread_num()
returns 返回调用该方法的线程的 ID。