-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMatUtil.c
72 lines (63 loc) · 1.35 KB
/
MatUtil.c
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "MatUtil.h"
void GenMatrix(int *mat, const size_t N)
{
int i;
for(i = 0; i < N*N; i ++)
mat[i] = rand()%32 - 1;
for(i = 0; i < N; i++)
mat[i*N + i] = 0;
}
bool CmpArray(const int *l, const int *r, const size_t eleNum)
{
int i;
for(i = 0; i < eleNum; i ++)
if(l[i] != r[i])
{
printf("ERROR: l[%d] = %d, r[%d] = %d\n", i, l[i], i, r[i]);
return false;
}
return true;
}
/*
Sequential (Single Thread) APSP on CPU.
*/
void ST_APSP(int *mat, const size_t N)
{
int i,j,k;
for(k = 0; k < N; k ++)
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
{
int i0 = i*N + j;
int i1 = i*N + k;
int i2 = k*N + j;
if(mat[i1] != -1 && mat[i2] != -1)
{
int sum = (mat[i1] + mat[i2]);
if (mat[i0] == -1 || sum < mat[i0])
mat[i0] = sum;
}
}
}
/*
Parallel (Single Thread) APSP on CPU.
*/
void parallel(int *mat, const size_t N)
{
int i,j,k;
for(k = 0; k < N; k ++)
#pragma omp parallel for private(i,j) schedule(dynamic,5)
for(i = 0; i < N; i ++)
for(j = 0; j < N; j ++)
{
int i0 = i*N + j;
int i1 = i*N + k;
int i2 = k*N + j;
if(mat[i1] != -1 && mat[i2] != -1)
{
int sum = (mat[i1] + mat[i2]);
if (mat[i0] == -1 || sum < mat[i0])
mat[i0] = sum;
}
}
}