Created
June 14, 2017 22:30
-
-
Save lazarljubenovic/e47ad67154098f8ff2ea15e510d33886 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 24. 9. 2016 (3) | |
#include <stdio.h> | |
#include <mpi.h> | |
#define W MPI_COMM_WORLD | |
int main(int argc, char** argv) { | |
MPI_Init(&argc, &argv); | |
int m = 3; | |
int n = 2; | |
int k = 6; | |
int s = 2; | |
int A[m][n], B[n][k], C[m][k]; | |
int locB[n][s], locC[m][s]; | |
int rank, size; | |
MPI_Datatype MPI_COLUMN_OLD; | |
MPI_Datatype MPI_COLUMN; | |
MPI_Comm_rank(W, &rank); | |
MPI_Comm_size(W, &size); | |
if (rank == 0) { | |
printf("\n===A===\n"); | |
for (int i = 0; i < m; i++) { | |
for (int j = 0; j < n; j++) { | |
A[i][j] = (i - j); | |
printf("%2d ", A[i][j]); | |
} | |
printf("\n"); | |
} | |
printf("\n===B===\n"); | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < k; j++) { | |
B[i][j] = i - j; | |
printf("%2d ", B[i][j]); | |
} | |
printf("\n"); | |
} | |
printf("\n"); | |
printf("\n"); | |
} | |
MPI_Type_vector(n, s, k, MPI_INT, &MPI_COLUMN_OLD); | |
MPI_Type_create_resized(MPI_COLUMN_OLD, 0, s * sizeof(int), &MPI_COLUMN); | |
MPI_Type_commit(&MPI_COLUMN); | |
MPI_Bcast(A, m * n, MPI_INT, 0, W); | |
MPI_Scatter(B, 1, MPI_COLUMN, locB, s * n, MPI_INT, 0, W); | |
for (int i = 0; i < m; i++) { | |
for (int ii = 0; ii < s; ii++) { | |
locC[i][ii] = 0; | |
for (int iii = 0; iii < n; iii++) { | |
locC[i][ii] += A[i][iii] * locB[iii][ii]; | |
} | |
} | |
} | |
for (int i = 0; i < m; i++) { | |
for (int j = 0; j < s; j++) { | |
printf("[%d] %3d\t", rank, locC[i][j]); | |
} | |
printf("\n"); | |
} | |
printf("\n"); | |
struct { | |
int value; | |
int index; | |
} locMin; | |
locMin.value = locB[0][0]; | |
locMin.index = rank; | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < s; j++) { | |
if (locB[i][j] < locMin.value) { | |
locMin.value = locB[i][j]; | |
} | |
} | |
} | |
printf("Najmanji u %d je %d.\n", locMin.index, locMin.value); | |
struct { | |
int value; | |
int index; | |
} min; | |
MPI_Reduce(&locMin, &min, 1, MPI_2INT, MPI_MINLOC, 0, W); | |
MPI_Bcast(&min, 1, MPI_2INT, 0, W); | |
int root = min.index; | |
if (rank == root) { | |
printf("{%d} Najmanji ukupno je %d s indeksom %d.\n", rank, min.value, min.index); | |
} | |
int tempC[m * k]; | |
MPI_Gather(locC, m * s, MPI_INT, tempC, m * s, MPI_INT, root, W); | |
if (rank == root) { | |
int w = 0; | |
for (int b = 0; b < k/s; b++) { | |
for (int i = 0; i < m; i++) { | |
for (int j = s * b; j < s * b + s; j++) { | |
C[i][j] = tempC[w++]; | |
} | |
} | |
} | |
for (int i = 0; i < m; i++) { | |
for (int j = 0; j < k; j++) { | |
printf("%3d\t", C[i][j]); | |
} | |
printf("\n"); | |
} | |
printf("\n"); | |
} | |
MPI_Finalize(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment