CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
随机生成一个 m*n 的整型矩阵,打印该矩阵,然后使用 openmp 并行寻找其最大值及坐标(x,y),最小值及坐标(p,q)。要求可并行化的循环都要并行化。
一开始是使用rand
函数生成随机数,结果发现每个线程生成的随机数序列都是一样的,这才发现rand
是线程不安全的。因此,使用线程安全的随机数函数rand_r
(Windows 下是rand_s
)。
这里做了一个小 trick,用一维数组去模拟矩阵。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
int main()
{
int m, n;
scanf("%d%d", &m, &n);
int *mat = malloc(m * n * sizeof(int)), ma = 0, mi = 0, pre = time(0);
#pragma omp parallel for
for (int i = 0; i < m * n; ++i)
rand_r(&pre), mat[i] = pre;
#pragma omp parallel for
for (int i = 0; i < m * n; ++i)
{
#pragma omp critical
if (mat[ma] < mat[i])
ma = i;
#pragma omp critical
if (mat[mi] > mat[i])
mi = i;
}
for (int i = 0; i < m * n; ++i)
printf("%d%c", mat[i], i % n == n - 1 ? '\n' : ' ');
printf("max: %d(%d,%d)\nmin: %d(%d,%d)", mat[ma], ma / n, ma % n, mat[mi], mi / n, mi % n);
free(mat);
}
运行结果如下
1
2
3
4
5
6
7
8
9
-925438579 -1126332182 -534488686 -1767211810
956745691 -2014164158 1868749196 173473471
-8830651 1176503991 1066009373 -1406904493
-1899449319 159599030 -609169565 1729478076
-880143610 -130409017 1504147669 -2027289992
-217405600 1943131529 -2112678481 -79255408
1178127908 -1166815919 -189038604 811456910
max: 1943131529(5,1)
min: -2112678481(5,2)