Skip to content

Instantly share code, notes, and snippets.

@lazarljubenovic
Created June 14, 2017 22:30
Show Gist options
  • Save lazarljubenovic/e47ad67154098f8ff2ea15e510d33886 to your computer and use it in GitHub Desktop.
Save lazarljubenovic/e47ad67154098f8ff2ea15e510d33886 to your computer and use it in GitHub Desktop.
// 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