Skip to content

Instantly share code, notes, and snippets.

@bfb
Created April 22, 2013 21:07
Show Gist options
  • Save bfb/5438578 to your computer and use it in GitHub Desktop.
Save bfb/5438578 to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <mpi.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
int rank, size, i, j, k, tag = 0;
MPI_Status status;
MPI_Init(&argc, &argv );
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
double start_time,final_time;
// Set matrices lines and columns
int lines = 10;
int columns = 10;
start_time = MPI_Wtime();
// double *receive = malloc(sizeof(double) * columns);
double *matrix_line = malloc(sizeof(double) * lines);
// initialize the matrix_b
double** matrix_b = (double**) malloc(sizeof(double*) * lines);
matrix_b[0] = (double*) malloc(lines * columns * sizeof(double));
for(i=1; i<lines; i++)
matrix_b[i] = &(matrix_b[0][i*columns]);
for(i = 0; i < lines; i++){
for(j = 0; j < columns; j++){
matrix_b[i][j] = (double) j;
}
}
// final matrix
double** final_matrix = (double**) malloc(sizeof(double*) * lines);
final_matrix[0] = (double*) malloc(lines * columns * sizeof(double));
for(i=1; i<lines; i++)
final_matrix[i] = &(final_matrix[0][i*columns]);
if(size > 1){
int partial = lines / (size -1);
printf("PARTIAL: %d", partial);
if (rank == 0){
double** matrix_a = (double**) malloc(sizeof(double*) * lines);
matrix_a[0] = (double*) malloc(lines * columns * sizeof(double));
for(i=1; i<lines; i++)
matrix_a[i] = &(matrix_a[0][i*columns]);
for(i = 0; i < lines; i++){
for(j = 0; j < columns; j++){
matrix_a[i][j] = (double) j;
}
}
// double** receive_partial_matrix = (double**) malloc(sizeof(double*) * partial);
// receive_partial_matrix[0] = (double*) malloc(partial * columns * sizeof(double));
// for(i=1; i<lines; i++)
// receive_partial_matrix[i] = &(receive_partial_matrix[0][i*columns]);
int count = 0;
for(j = 1; j < size; j++){
// Receive partial to calculate
// double** receive_partial = (double**) malloc(sizeof(double*) * partial);
// receive_partial[0] = (double*) malloc(partial * columns * sizeof(double));
// for(i=1; i<lines; i++)
// receive_partial[i] = &(receive_partial[0][i*columns]);
printf("COUNT: %d\n", count);
MPI_Send(&matrix_a[count][0], partial * columns, MPI_DOUBLE, j, tag, MPI_COMM_WORLD);
MPI_Recv(&final_matrix[count][0], partial * columns, MPI_DOUBLE, j, tag, MPI_COMM_WORLD, &status);
count += partial;
}
final_time = MPI_Wtime();
printf("Time: %f\n", final_time - start_time);
} else {
double** receive = (double**) malloc(sizeof(double*) * partial);
receive[0] = (double*) malloc(partial * columns * sizeof(double));
for(i=1; i<lines; i++)
receive[i] = &(receive[0][i*columns]);
double** partial_matrix = (double**) malloc(sizeof(double*) * partial);
partial_matrix[0] = (double*) malloc(partial * columns * sizeof(double));
for(i=1; i<lines; i++)
partial_matrix[i] = &(partial_matrix[0][i*columns]);
double *line = malloc(sizeof(double) * lines);
printf("PARTIAL => %d", partial);
MPI_Recv(&receive[0][0], partial * columns, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD, &status);
double partial_counter = 0.0;
for(k = 0; k < partial; k++){
for(i = 0; i < partial; i++){
for(j = 0; j < columns; j++){
// printf("%d * %d + ", receive[j], matrix_b[j][i]);
partial_counter += receive[k][j] * matrix_b[j][i];
}
// printf("PARTIAL: %d\n", partial);
line[i] = partial_counter;
partial_counter = 0.0;
}
partial_matrix[k] = matrix_line;
}
MPI_Send(&partial_matrix[0][0], partial * columns, MPI_DOUBLE, 0, tag, MPI_COMM_WORLD);
}
} else {
double** matrix_a = (double**) malloc(sizeof(double*) * lines);
matrix_a[0] = (double*) malloc(lines * columns * sizeof(double));
for(i=1; i<lines; i++)
matrix_a[i] = &(matrix_a[0][i*columns]);
for(i = 0; i < lines; i++){
for(j = 0; j < columns; j++){
matrix_a[i][j] = (double) j;
}
}
double partial = 0.0;
for(k = 0; k < lines; k++){
for(i = 0; i < lines; i++){
for(j = 0; j < columns; j++){
// printf("%d * %d + ", receive[j], matrix_b[j][i]);
partial += matrix_a[k][j] * matrix_b[j][i];
}
// printf("PARTIAL: %d\n", partial);
matrix_line[i] = partial;
partial = 0;
}
final_matrix[k] = matrix_line;
}
// // Show matrix
// for(i = 0; i < lines; i++){
// for(j = 0; j < columns; j++){
// printf("%f,", final_matrix[i][j]);
// }
// printf("\n");
// }
final_time = MPI_Wtime();
printf("Time: %f\n", final_time - start_time);
}
MPI_Finalize();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment