Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
pp-heatmap
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Björn Fischer
pp-heatmap
Commits
eda4b55e
Commit
eda4b55e
authored
Dec 29, 2015
by
Björn Fischer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changes
parent
707f25c9
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
164 additions
and
10336 deletions
+164
-10336
Matrix.txt
Matrix.txt
+22
-10304
matrix.c
matrix.c
+10
-1
proj
proj
+0
-0
proj.c
proj.c
+128
-31
project.h
project.h
+4
-0
No files found.
Matrix.txt
View file @
eda4b55e
This diff is collapsed.
Click to expand it.
matrix.c
View file @
eda4b55e
...
@@ -99,7 +99,16 @@ void Insert_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim
...
@@ -99,7 +99,16 @@ void Insert_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim
int
i
,
j
;
int
i
,
j
;
for
(
i
=
0
;
i
<
b_dim0
-
offset_dim0_left
-
offset_dim0_right
;
i
++
)
{
for
(
i
=
0
;
i
<
b_dim0
-
offset_dim0_left
-
offset_dim0_right
;
i
++
)
{
for
(
j
=
0
;
j
<
b_dim1
-
offset_dim1_left
-
offset_dim1_right
;
j
++
)
{
for
(
j
=
0
;
j
<
b_dim1
-
offset_dim1_left
-
offset_dim1_right
;
j
++
)
{
a
[
pos_dim0
+
i
][
pos_dim0
+
j
]
=
b
[
offset_dim0_left
+
i
][
offset_dim1_right
+
j
];
a
[
pos_dim0
+
i
][
pos_dim1
+
j
]
=
b
[
offset_dim0_left
+
i
][
offset_dim1_right
+
j
];
}
}
}
void
Insert_Array_In_Matrix
(
double
**
a
,
int
a_dim0
,
int
a_dim1
,
int
pos_dim0
,
int
pos_dim1
,
double
*
b
,
int
b_dim0
,
int
b_dim1
,
int
offset_dim0_left
,
int
offset_dim0_right
,
int
offset_dim1_left
,
int
offset_dim1_right
)
{
int
i
,
j
;
for
(
i
=
0
;
i
<
b_dim0
-
offset_dim0_left
-
offset_dim0_right
;
i
++
)
{
for
(
j
=
0
;
j
<
b_dim1
-
offset_dim1_left
-
offset_dim1_right
;
j
++
)
{
a
[
pos_dim0
+
i
][
pos_dim1
+
j
]
=
b
[(
offset_dim0_left
+
i
)
*
b_dim1
+
offset_dim1_right
+
j
];
}
}
}
}
}
}
\ No newline at end of file
proj
View file @
eda4b55e
No preview for this file type
proj.c
View file @
eda4b55e
#define min(X,Y) (((X) < (Y)) ? (X) : (Y))
#define max(X,Y) (((X) > (Y)) ? (X) : (Y))
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <math.h>
#include <math.h>
...
@@ -9,27 +11,38 @@
...
@@ -9,27 +11,38 @@
double
eps
=
0
.
001
;
double
eps
=
0
.
001
;
double
delta_t
=
0
.
000001
;
double
delta_t
=
0
.
000001
;
double
alpha
=
1
;
double
alpha
=
1
;
MPI_Datatype
MPI_process_info
;
void
Create_MPI_Type_t_process_info
()
{
t_process_info
mock
;
MPI_Datatype
type
[
7
]
=
{
MPI_INT
,
MPI_INT
,
MPI_INT
,
MPI_INT
,
MPI_INT
,
MPI_INT
,
MPI_INT
};
int
blocklen
[
7
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
};
MPI_Aint
disp
[
7
];
disp
[
0
]
=
(
int
)
&
(
mock
.
rank
)
-
(
int
)
&
mock
;
disp
[
1
]
=
(
int
)
&
(
mock
.
coord0
)
-
(
int
)
&
mock
;
disp
[
2
]
=
(
int
)
&
(
mock
.
coord1
)
-
(
int
)
&
mock
;
disp
[
3
]
=
(
int
)
&
(
mock
.
start_m
)
-
(
int
)
&
mock
;
disp
[
4
]
=
(
int
)
&
(
mock
.
start_n
)
-
(
int
)
&
mock
;
disp
[
5
]
=
(
int
)
&
(
mock
.
end_m
)
-
(
int
)
&
mock
;
disp
[
6
]
=
(
int
)
&
(
mock
.
end_n
)
-
(
int
)
&
mock
;
MPI_Type_create_struct
(
7
,
blocklen
,
disp
,
type
,
&
MPI_process_info
);
MPI_Type_commit
(
&
MPI_process_info
);
}
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
MPI_Init
(
&
argc
,
&
argv
);
MPI_Init
(
&
argc
,
&
argv
);
int
m
,
n
;
int
m
,
n
;
double
**
root_field
;
double
**
partial_field
;
double
**
partial_field
;
double
start
,
end
;
double
start
,
end
;
t_process_info
pi
;
t_process_info
pi
;
t_process_info
*
infos
;
process_args
(
argc
,
argv
,
&
m
,
&
n
,
&
eps
,
&
delta_t
);
Create_MPI_Type_t_process_info
(
);
/*
process_args
(
argc
,
argv
,
&
m
,
&
n
,
&
eps
,
&
delta_t
);
a = New_Matrix(m, n);
if (a == NULL) {
fprintf(stderr, "Can't allocate matrix !\n");
exit(1);
}
Init_Matrix(a, m, n, 0);
*/
int
pid
,
num_p
;
int
pid
,
num_p
;
if
(
MPI_Comm_rank
(
MPI_COMM_WORLD
,
&
pid
))
{
if
(
MPI_Comm_rank
(
MPI_COMM_WORLD
,
&
pid
))
{
fprintf
(
stderr
,
"Cannot fetch PID
\n
"
);
fprintf
(
stderr
,
"Cannot fetch PID
\n
"
);
...
@@ -41,6 +54,16 @@ int main(int argc, char **argv)
...
@@ -41,6 +54,16 @@ int main(int argc, char **argv)
exit
(
1
);
exit
(
1
);
}
}
if
(
pid
==
0
)
{
root_field
=
New_Matrix
(
m
,
n
);
if
(
root_field
==
NULL
)
{
fprintf
(
stderr
,
"PID %s: Can't allocate root_field !
\n
"
,
pid
);
exit
(
1
);
}
Init_Matrix
(
root_field
,
m
,
n
,
0
);
}
if
(
pid
==
0
)
{
if
(
pid
==
0
)
{
printf
(
"number of processes: %d
\n
"
,
num_p
);
printf
(
"number of processes: %d
\n
"
,
num_p
);
}
}
...
@@ -84,41 +107,83 @@ int main(int argc, char **argv)
...
@@ -84,41 +107,83 @@ int main(int argc, char **argv)
pi
.
start_m
=
coord
[
0
]
*
m_per_pro
;
pi
.
start_m
=
coord
[
0
]
*
m_per_pro
;
pi
.
end_m
=
(
coord
[
0
]
+
1
)
*
m_per_pro
-
1
;
pi
.
end_m
=
(
coord
[
0
]
+
1
)
*
m_per_pro
-
1
;
pi
.
start_n
=
coord
[
1
]
*
n_per_pro
;
pi
.
start_n
=
coord
[
1
]
*
n_per_pro
;
pi
.
end_n
=
(
coord
[
0
]
+
1
)
*
n_per_pro
-
1
;
pi
.
end_n
=
(
coord
[
1
]
+
1
)
*
n_per_pro
-
1
;
if
(
pi
.
end_m
>
m
-
1
)
{
if
(
pi
.
end_m
>
m
-
1
)
{
pi
.
end_m
=
m
-
1
;
pi
.
end_m
=
m
-
1
;
}
}
if
(
pi
.
end_n
>
n
-
1
)
{
if
(
pi
.
end_n
>
n
-
1
)
{
pi
.
end_n
=
n
-
1
;
pi
.
end_n
=
n
-
1
;
}
}
pi
.
coord0
=
coord
[
0
];
pi
.
coord1
=
coord
[
1
];
pi
.
rank
=
pid
;
int
matrix_size
[
2
];
matrix_size
[
0
]
=
pi
.
end_m
-
pi
.
start_m
+
3
;
matrix_size
[
1
]
=
pi
.
end_n
-
pi
.
start_n
+
3
;
if
(
MPI_Comm_size
(
cart_comm
,
&
num_p
))
{
fprintf
(
stderr
,
"Cannot fetch size of cart
\n
"
);
exit
(
1
);
}
if
(
pid
==
0
)
{
infos
=
malloc
(
sizeof
(
t_process_info
)
*
num_p
);
}
if
(
MPI_Gather
(
&
pi
,
1
,
MPI_process_info
,
infos
,
1
,
MPI_process_info
,
0
,
cart_comm
))
{
fprintf
(
stderr
,
"Gather failed
\n
"
);
exit
(
1
);
}
int
i
,
j
;
if
(
pid
==
0
)
{
for
(
i
=
0
;
i
<
num_p
;
i
++
)
{
printf
(
"pid: %d->(%d,%d) from (%d, %d) to (%d,%d)
\n
"
,
infos
[
i
].
rank
,
infos
[
i
].
coord0
,
infos
[
i
].
coord1
,
infos
[
i
].
start_m
,
infos
[
i
].
start_n
,
infos
[
i
].
end_m
,
infos
[
i
].
end_n
);
}
}
// print own info
double
delta_a
;
printf
(
"pid(%d,%d) from (%d, %d) to (%d,%d)
\n
"
,
partial_field
=
New_Matrix
(
matrix_size
[
0
],
matrix_size
[
1
]);
coord
[
0
],
if
(
partial_field
==
NULL
)
{
coord
[
1
],
fprintf
(
stderr
,
"PID %d: Can't allocate partial_field %d, %d end_M: %d, start_m: %d, end_n: %d, start_n: %d!
\n
"
,
pi
.
start_n
,
pid
,
matrix_size
[
0
],
matrix_size
[
1
],
pi
.
end_m
,
pi
.
start_m
,
pi
.
start_m
,
pi
.
end_n
,
pi
.
end_n
,
pi
.
end_m
pi
.
start_n
);
);
exit
(
1
);
}
double
delta_a
;
double
**
partial_field_tmp
=
New_Matrix
(
matrix_size
[
0
],
matrix_size
[
1
]);
partial_field
=
New_Matrix
(
pi
.
end_m
-
pi
.
start_m
+
2
,
pi
.
end_n
-
pi
.
start_n
+
2
);
double
**
partial_field_tmp
=
New_Matrix
(
pi
.
end_m
-
pi
.
start_m
+
2
,
pi
.
end_n
-
pi
.
start_n
+
2
);
int
i
,
j
;
double
**
swap
;
double
**
swap
;
double
hx
=
1
.
0
/
(
double
)
m
;
double
hx
=
1
.
0
/
(
double
)
m
;
double
hy
=
1
.
0
/
(
double
)
n
;
double
hy
=
1
.
0
/
(
double
)
n
;
double
hx_square
=
hx
*
hx
;
double
hx_square
=
hx
*
hx
;
double
hy_square
=
hy
*
hy
;
double
hy_square
=
hy
*
hy
;
double
max_delta_t
=
0
.
25
*
((
min
(
hx
,
hy
))
*
(
min
(
hx
,
hy
)))
/
alpha
;
/* minimaler Wert f
�
r Konvergenz */
double
max_delta_t
=
0
.
25
*
((
min
(
hx
,
hy
))
*
(
min
(
hx
,
hy
)))
/
alpha
;
/* minimaler Wert f
ü
r Konvergenz */
if
(
delta_t
>
max_delta_t
)
{
if
(
delta_t
>
max_delta_t
)
{
delta_t
=
max_delta_t
;
delta_t
=
max_delta_t
;
if
(
pid
==
0
)
printf
(
"Info: delta_t set to %.10lf.
\n
"
,
delta_t
);
printf
(
"Info: delta_t set to %.10lf.
\n
"
,
delta_t
);
}
}
for
(
i
=
1
;
i
<
pi
.
end_m
-
pi
.
start_m
+
1
;
i
++
)
{
// catch edges
for
(
j
=
1
;
j
<
pi
.
end_n
-
pi
.
start_n
+
1
;
j
++
)
{
// catch edges
for
(
i
=
1
;
i
<
pi
.
end_m
-
pi
.
start_m
+
2
;
i
++
)
{
// catch edges
for
(
j
=
1
;
j
<
pi
.
end_n
-
pi
.
start_n
+
2
;
j
++
)
{
// catch edges
/*
delta_a = alpha *
delta_a = alpha *
( (partial_field[i+1][j] + partial_field[i-1][j] - 2.0 * partial_field[i][j]) / (hy_square)
( (partial_field[i+1][j] + partial_field[i-1][j] - 2.0 * partial_field[i][j]) / (hy_square)
+(partial_field[i][j-1] + partial_field[i][j+1] - 2.0 * partial_field[i][j]) / (hx_square) );
+(partial_field[i][j-1] + partial_field[i][j+1] - 2.0 * partial_field[i][j]) / (hx_square) );
...
@@ -127,20 +192,52 @@ int main(int argc, char **argv)
...
@@ -127,20 +192,52 @@ int main(int argc, char **argv)
if(delta_a > maxdiff)
if(delta_a > maxdiff)
maxdiff = delta_a;
maxdiff = delta_a;
*/
partial_field_tmp
[
i
][
j
]
=
8
;
}
}
}
}
swap
=
partial_field_tmp
;
swap
=
partial_field_tmp
;
partial_field_tmp
=
partial_field
;
partial_field_tmp
=
partial_field
;
partial_field
=
swap
;
partial_field
=
swap
;
//Send_To_Root(partial_field, pi.end_m - pi.start_m + 2, pi.end_n - pi.start_n + 2);
MPI_Send
(
partial_field
[
0
],
matrix_size
[
0
]
*
matrix_size
[
1
],
MPI_DOUBLE
,
0
,
0
,
cart_comm
);
if
(
pid
==
0
)
{
if
(
pid
==
0
)
{
Write_Matrix
(
partial_field
,
pi
.
end_m
-
pi
.
start_m
+
2
,
pi
.
end_n
-
pi
.
start_n
+
2
);
MPI_Request
*
requests
=
malloc
(
sizeof
(
MPI_Request
)
*
num_p
);
double
**
allocation
=
malloc
(
sizeof
(
double
*
)
*
num_p
);
for
(
i
=
0
;
i
<
num_p
;
i
++
)
{
allocation
[
i
]
=
malloc
(
sizeof
(
double
)
*
(
infos
[
i
].
end_m
-
infos
[
i
].
start_m
+
3
)
*
(
infos
[
i
].
end_n
-
infos
[
i
].
start_n
+
3
));
MPI_Irecv
(
allocation
[
i
],
(
infos
[
i
].
end_m
-
infos
[
i
].
start_m
+
3
)
*
(
infos
[
i
].
end_n
-
infos
[
i
].
start_n
+
3
),
MPI_DOUBLE
,
infos
[
i
].
rank
,
MPI_ANY_TAG
,
cart_comm
,
&
requests
[
i
]
);
}
for
(
i
=
0
;
i
<
num_p
;
i
++
)
{
int
current
;
MPI_Waitany
(
num_p
,
requests
,
&
current
,
MPI_STATUS_IGNORE
);
Insert_Array_In_Matrix
(
root_field
,
m
,
n
,
infos
[
current
].
start_m
,
infos
[
current
].
start_n
,
allocation
[
current
],
infos
[
current
].
end_m
-
infos
[
current
].
start_m
+
3
,
infos
[
current
].
end_n
-
infos
[
current
].
start_n
+
3
,
1
,
1
,
1
,
1
);
free
(
allocation
[
current
]);
}
free
(
requests
);
free
(
allocation
);
Write_Matrix
(
root_field
,
m
,
n
);
}
}
// write neighbar_com function
// write neighbar_com function
//MPI_Gather()
//MPI_Gather()
MPI_Finalize
();
MPI_Finalize
();
...
...
project.h
View file @
eda4b55e
...
@@ -3,9 +3,13 @@ void Delete_Matrix(double **matrix);
...
@@ -3,9 +3,13 @@ void Delete_Matrix(double **matrix);
void
Write_Matrix
(
double
**
a
,
int
m
,
int
n
);
void
Write_Matrix
(
double
**
a
,
int
m
,
int
n
);
void
Init_Matrix
(
double
**
a
,
int
m
,
int
n
,
int
init_value
);
void
Init_Matrix
(
double
**
a
,
int
m
,
int
n
,
int
init_value
);
void
Insert_Matrix
(
double
**
a
,
int
a_dim0
,
int
a_dim1
,
int
pos_dim0
,
int
pos_dim1
,
double
**
b
,
int
b_dim0
,
int
b_dim1
,
int
offset_top
,
int
offset_right
,
int
offset_bottom
,
int
offset_left
);
void
Insert_Matrix
(
double
**
a
,
int
a_dim0
,
int
a_dim1
,
int
pos_dim0
,
int
pos_dim1
,
double
**
b
,
int
b_dim0
,
int
b_dim1
,
int
offset_top
,
int
offset_right
,
int
offset_bottom
,
int
offset_left
);
void
Insert_Array_In_Matrix
(
double
**
a
,
int
a_dim0
,
int
a_dim1
,
int
pos_dim0
,
int
pos_dim1
,
double
*
b
,
int
b_dim0
,
int
b_dim1
,
int
offset_top
,
int
offset_right
,
int
offset_bottom
,
int
offset_left
);
void
process_args
(
int
argc
,
char
**
argv
,
int
*
m
,
int
*
n
,
double
*
eps
,
double
*
delta_t
);
void
process_args
(
int
argc
,
char
**
argv
,
int
*
m
,
int
*
n
,
double
*
eps
,
double
*
delta_t
);
typedef
struct
{
typedef
struct
{
int
rank
;
int
coord0
;
int
coord1
;
int
start_m
;
// first tile to process in X-axis
int
start_m
;
// first tile to process in X-axis
int
start_n
;
// first tile to process in Y-axis
int
start_n
;
// first tile to process in Y-axis
int
end_m
;
// last tile to process in X-axis
int
end_m
;
// last tile to process in X-axis
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment