Commit eda4b55e authored by Björn Fischer's avatar Björn Fischer

changes

parent 707f25c9
This diff is collapsed.
...@@ -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
No preview for this file type
#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 fr 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();
......
...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment