From f24b3cff2f00158219a4146451aa2591b28e5ef2 Mon Sep 17 00:00:00 2001
From: mfikrin <muhammad.fikrin1729@gmail.com>
Date: Sun, 6 Mar 2022 16:07:23 +0700
Subject: [PATCH] feat : data type matrix

---
 src/change     | Bin 0 -> 16752 bytes
 src/change.c   |   9 +
 src/par        | Bin 0 -> 21944 bytes
 src/parallel.c | 466 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/person.c   | 150 ++++++++++++++++
 src/serial     | Bin 0 -> 21480 bytes
 src/serial.c   |  17 +-
 7 files changed, 641 insertions(+), 1 deletion(-)
 create mode 100644 src/change
 create mode 100644 src/change.c
 create mode 100644 src/par
 create mode 100644 src/parallel.c
 create mode 100644 src/person.c
 create mode 100644 src/serial

diff --git a/src/change b/src/change
new file mode 100644
index 0000000000000000000000000000000000000000..d78540c6dc330c412b7850b2a1bc976244ee4fc3
GIT binary patch
literal 16752
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
V*C@p~d3pP%+YOB^HUpa|{sqg6fV%(y

literal 0
HcmV?d00001

diff --git a/src/change.c b/src/change.c
new file mode 100644
index 0000000..d77c2d9
--- /dev/null
+++ b/src/change.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+int main() {
+   const int x = 10; //define constant int
+   int *ptr;
+   printf("x = %d\n", x);
+   ptr = &x; //ptr points the variable x
+   *ptr = 15; //Updating through pointer
+   printf("x = %d\n", x);
+}
\ No newline at end of file
diff --git a/src/par b/src/par
new file mode 100644
index 0000000000000000000000000000000000000000..ffe23201b382ad85b854f2b410f170a9d593b6e4
GIT binary patch
literal 21944
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
NR!PkAD0q_MzX0J|fC~Ts

literal 0
HcmV?d00001

diff --git a/src/parallel.c b/src/parallel.c
new file mode 100644
index 0000000..4ae1b64
--- /dev/null
+++ b/src/parallel.c
@@ -0,0 +1,466 @@
+// serial.c
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <mpi.h>
+
+#define NMAX 100
+#define DATAMAX 1000
+#define DATAMIN -1000
+
+/* 
+ * Struct Matrix
+ *
+ * Matrix representation consists of matrix data 
+ * and effective dimensions 
+ * */
+typedef struct Matrix {
+	int mat[NMAX][NMAX];	// Matrix cells
+	int row_eff;			// Matrix effective row
+	int col_eff;			// Matrix effective column
+} Matrix;
+
+
+/* 
+ * Procedure init_matrix
+ * 
+ * Initializing newly allocated matrix
+ * Setting all data to 0 and effective dimensions according
+ * to nrow and ncol 
+ * */
+void init_matrix(Matrix *m, int nrow, int ncol) {
+	m->row_eff = nrow;
+	m->col_eff = ncol;
+
+	for (int i = 0; i < m->row_eff; i++) {
+		for (int j = 0; j < m->col_eff; j++) {
+			m->mat[i][j] = 0;
+		}
+	}
+}
+
+
+/* 
+ * Function input_matrix
+ *
+ * Returns a matrix with values from stdin input
+ * */
+Matrix input_matrix(int nrow, int ncol) {
+	Matrix input;
+	init_matrix(&input, nrow, ncol);
+
+	for (int i = 0; i < nrow; i++) {
+		for (int j = 0; j < ncol; j++) {
+			scanf("%d", &input.mat[i][j]);
+		}
+	}
+
+	return input;
+}
+
+
+/* 
+ * Procedure print_matrix
+ * 
+ * Print matrix data
+ * */
+void print_matrix(Matrix *m) {
+	for (int i = 0; i < m->row_eff; i++) {
+		for (int j = 0; j < m->col_eff; j++) {
+			printf("%d ", m->mat[i][j]);
+		}
+		printf("\n");
+	}
+}
+
+
+/* 
+ * Function get_matrix_datarange
+ *
+ * Returns the range between maximum and minimum
+ * element of a matrix
+ * */
+int get_matrix_datarange(Matrix *m) {
+	int max = DATAMIN;
+	int min = DATAMAX;
+	for (int i = 0; i < m->row_eff; i++) {
+		for (int j = 0; j < m->col_eff; j++) {
+			int el = m->mat[i][j];
+			if (el > max) max = el;
+			if (el < min) min = el;
+		}
+	}
+
+	return max - min;
+}
+
+
+/*
+ * Function supression_op
+ *
+ * Returns the sum of intermediate value of special multiplication
+ * operation where kernel[0][0] corresponds to target[row][col]
+ * */
+int supression_op(Matrix *kernel, Matrix *target, int row, int col) {
+	int intermediate_sum = 0;
+	for (int i = 0; i < kernel->row_eff; i++) {
+		for (int j = 0; j < kernel->col_eff; j++) {
+			intermediate_sum += kernel->mat[i][j] * target->mat[row + i][col + j];
+		}
+	}
+
+	return intermediate_sum;
+}
+
+
+/* 
+ * Function convolution
+ *
+ * Return the output matrix of convolution operation
+ * between kernel and target
+ * */
+Matrix convolution(Matrix *kernel, Matrix *target) {
+	Matrix out;
+	int out_row_eff = target->row_eff - kernel->row_eff + 1;
+	int out_col_eff = target->col_eff - kernel->col_eff + 1;
+
+    // printf("kernel row %d",kernel->row_eff);
+    // printf("kernel col %d",kernel->col_eff);
+
+    // printf("out_row_eff %d %d",out_row_eff,out_col_eff);
+	
+	init_matrix(&out, out_row_eff, out_col_eff);
+
+	for (int i = 0; i < out.row_eff; i++) {
+		for (int j = 0; j < out.col_eff; j++) {
+			out.mat[i][j] = supression_op(kernel, target, i, j);
+		}
+	}
+
+	return out;
+}
+
+
+/*
+ * Procedure merge_array
+ *
+ * Merges two subarrays of n with n[left..mid] and n[mid+1..right]
+ * to n itself, with n now ordered ascendingly
+ * */
+void merge_array(int *n, int left, int mid, int right) {
+	int n_left = mid - left + 1;
+	int n_right = right - mid;
+	int iter_left = 0, iter_right = 0, iter_merged = left;
+	int arr_left[n_left], arr_right[n_right];
+
+	for (int i = 0; i < n_left; i++) {
+		arr_left[i] = n[i + left];
+	}
+
+	for (int i = 0; i < n_right; i++) {
+		arr_right[i] = n[i + mid + 1];
+	}
+
+	while (iter_left < n_left && iter_right < n_right) {
+		if (arr_left[iter_left] <= arr_right[iter_right]) {
+			n[iter_merged] = arr_left[iter_left++];
+		} else {
+			n[iter_merged] = arr_right[iter_right++];
+		}
+		iter_merged++;
+	}
+
+	while (iter_left < n_left)  {
+		n[iter_merged++] = arr_left[iter_left++];
+	}
+	while (iter_right < n_right) {
+		n[iter_merged++] = arr_right[iter_right++];
+	} 
+}
+
+
+/* 
+ * Procedure merge_sort
+ *
+ * Sorts array n with merge sort algorithm
+ * */
+void merge_sort(int *n, int left, int right) {
+	if (left < right) {
+		int mid = left + (right - left) / 2;
+
+		merge_sort(n, left, mid);
+		merge_sort(n, mid + 1, right);
+
+		merge_array(n, left, mid, right);
+	}	
+}
+ 
+
+/* 
+ * Procedure print_array
+ *
+ * Prints all elements of array n of size to stdout
+ * */
+void print_array(int *n, int size) {
+	for (int i = 0; i < size; i++ ) printf("%d ", n[i]);
+	printf("\n");
+}
+
+
+/* 
+ * Function get_median
+ *
+ * Returns median of array n of length
+ * */
+int get_median(int *n, int length) {
+	int mid = length / 2;
+	if (length & 1) return n[mid];
+
+	return (n[mid - 1] + n[mid]) / 2;
+}
+
+
+/* 
+ * Function get_floored_mean
+ *
+ * Returns floored mean from an array of integers
+ * */
+long get_floored_mean(int *n, int length) {
+	long sum = 0;
+	for (int i = 0; i < length; i++) {
+		sum += n[i];
+	}
+
+	return sum / length;
+}
+
+
+void distribute(void* data, int count, MPI_Datatype datatype, int root,
+              MPI_Comm communicator) {
+	int world_rank;
+	MPI_Comm_rank(communicator, &world_rank);
+	int world_size;
+	MPI_Comm_size(communicator, &world_size);
+
+	// Procecss 0 --> Kirim matriks inputan 1,2,3 ke prcess 1,2,3
+	// process 1,2,3 -> receive
+	// prcess 0 --> kirim matriks input 4,5,6, ke process 1,2,3
+	
+	if (world_rank == root) {
+	// If we are the root process, send our data to every process
+	int i;
+	for (i = 0; i < world_size; i++) {
+		if (i != world_rank) {
+		MPI_Send(data, count, datatype, i, 0, communicator);
+		}
+	}
+	} else {
+	// If we are a receiver process, receive the data from the root
+	MPI_Recv(data, count, datatype, root, 0, communicator,
+				MPI_STATUS_IGNORE);
+    
+
+	// Ngitung con sama data range		 
+	}
+}
+
+// void init_matrix_kernel() {
+// 	m->row_eff = 2;
+// 	m->col_eff = 2;
+
+// 	m->mat[0][0] = 1;
+//     m->mat[0][1] = 0;
+//     m->mat[1][0] = 0;
+//     m->mat[1][1] = -1;
+// }
+
+// main() driver
+int main() {
+	// OPEN MPI
+	MPI_Init(NULL, NULL);
+
+	int world_rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
+    int world_size;
+    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
+
+	const int PING_PONG_LIMIT = 3;
+    printf("HELLO WORLD\n");
+	
+    // 10 / 4 = 2 2 2 (10-6)
+    int kernel_row, kernel_col, target_row, target_col, num_targets;
+	
+	// reads kernel's row and column and initalize kernel matrix from input
+	scanf("%d %d", &kernel_row, &kernel_col);
+	Matrix kernel = input_matrix(kernel_row, kernel_col);
+	
+	// reads number of target matrices and their dimensions.
+	// initialize array of matrices and array of data ranges (int)
+	scanf("%d %d %d", &num_targets, &target_row, &target_col);
+	Matrix* arr_mat = (Matrix*)malloc(num_targets * sizeof(Matrix));
+	Matrix* arr_mat2 = (Matrix*)malloc(num_targets * sizeof(Matrix));
+	int arr_range[num_targets];
+    
+	
+	// read each target matrix, compute their convolution matrices, and compute their data ranges
+	for (int i = 0; i < num_targets; i++) {
+		arr_mat[i] = input_matrix(target_row, target_col);	 
+	}
+
+    print_matrix(&kernel);
+
+	int counter_distribute = 0;
+	int counter_receiver = 0;
+
+    printf("HELLO OPEN MPI\n");
+
+	
+
+    // --------------------------- Create the datatype ----------------------------- //
+    MPI_Datatype mat_MPI;
+    int lengths[3] = { NMAX * NMAX, 1, 1 };
+ 
+    // Calculate displacements
+    // In C, by default padding can be inserted between fields. MPI_Get_address will allow
+    // to get the address of each struct field and calculate the corresponding displacement
+    // relative to that struct base address. The displacements thus calculated will therefore
+    // include padding if any.
+    MPI_Aint displacements[3];
+    Matrix dummy_matrix;
+    MPI_Aint base_address;
+    MPI_Get_address(&dummy_matrix, &base_address);
+    MPI_Get_address(&dummy_matrix.mat, &displacements[0]);
+    MPI_Get_address(&dummy_matrix.row_eff, &displacements[1]);
+    MPI_Get_address(&dummy_matrix.col_eff, &displacements[2]);
+    displacements[0] = MPI_Aint_diff(displacements[0], base_address);
+    displacements[1] = MPI_Aint_diff(displacements[1], base_address);
+    displacements[2] = MPI_Aint_diff(displacements[2], base_address);
+ 
+    MPI_Datatype types[3] = { MPI_INT, MPI_INT, MPI_INT };
+    MPI_Type_create_struct(3, lengths, displacements, types, &mat_MPI);
+    MPI_Type_commit(&mat_MPI);
+     
+    // --------------------------- End Create the datatype ----------------------------- //
+
+	// Distribusi matriks input ke process-process
+	
+    /*
+    0 1 2 3 4 5 6 7 8 9
+
+    0 1 2
+
+    3 4 5
+
+    6 7 8
+
+    9
+
+    */ 
+
+
+
+
+    int root = 0;
+
+	if (world_rank == root) {
+			// If we are the root process, send our data to every process
+            int i;
+            for (i = 0; i < world_size; i++) {
+                if (i != world_rank) {
+                    MPI_Send(&arr_mat[counter_distribute], 1, mat_MPI, i, 0, MPI_COMM_WORLD);
+                    counter_distribute++;
+                }
+            }
+            print_matrix(&kernel);
+			printf("PRocess 0 distribute\n ");
+			
+		} else {
+			printf("PRocess selain 0  distribute %d \n", world_rank);
+			// If we are a receiver process, receive the data from the root
+            Matrix recv_data;
+            MPI_Recv(&recv_data, 1, mat_MPI, root, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            print_matrix(&recv_data);
+
+			printf("HASILLL\n");
+			arr_mat2[counter_receiver] = convolution(&m, &recv_data);
+            
+            print_matrix(&arr_mat2[counter_receiver]);
+			arr_range[counter_receiver] = get_matrix_datarange(&arr_mat2[counter_receiver]);
+
+			counter_receiver++;
+		}
+
+    while (counter_distribute < PING_PONG_LIMIT){
+        // distribute(arr_mat[counter_distribute],1,mat_MPI,0, MPI_COMM_WORLD)
+		printf("Counter dis %d \n", counter_distribute);
+		if (world_rank == root) {
+			// If we are the root process, send our data to every process
+            int i;
+            for (i = 0; i < world_size; i++) {
+                if (i != world_rank) {
+                    MPI_Send(&arr_mat[counter_distribute], 1, mat_MPI, i, 0, MPI_COMM_WORLD);
+                    counter_distribute++;
+                }
+            }
+            print_matrix(&kernel);
+			printf("PRocess 0 distribute\n ");
+			
+		} else {
+			printf("PRocess selain 0  distribute %d \n", world_rank);
+			// If we are a receiver process, receive the data from the root
+            Matrix recv_data;
+            MPI_Recv(&recv_data, 1, mat_MPI, root, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            print_matrix(&recv_data);
+            Matrix m;
+            m.row_eff = 2;
+            m.col_eff = 2;
+
+            m.mat[0][0] = 1;
+            m.mat[0][1] = 0;
+            m.mat[1][0] = 0;
+            m.mat[1][1] = -1;
+            print_matrix(&m);
+
+			printf("HASILLL\n");
+			arr_mat2[counter_receiver] = convolution(&m, &recv_data);
+            
+            print_matrix(&arr_mat2[counter_receiver]);
+			arr_range[counter_receiver] = get_matrix_datarange(&arr_mat2[counter_receiver]);
+
+			counter_receiver++;
+		}
+    }
+
+	MPI_Finalize();
+    
+
+    // // Print hasil
+	// for (int i = 0; i < num_targets; i++) {
+	// 	printf("\nMATRIX CONV %d",i);
+	// 	print_matrix(arr_mat2); 
+	// }
+
+	// // sort the data range array
+	// printf("\n");
+	// print_array(arr_range,num_targets);
+	// merge_sort(arr_range, 0, num_targets - 1);
+	
+	// int median = get_median(arr_range, num_targets);	
+	// int floored_mean = get_floored_mean(arr_range, num_targets); 
+
+	// // print the min, max, median, and floored mean of data range array
+	// printf("%d\n%d\n%d\n%d\n", 
+	// 		arr_range[0], 
+	// 		arr_range[num_targets - 1], 
+	// 		median, 
+	// 		floored_mean);
+
+    
+	
+    // START OPEN MP	
+	
+	
+    
+	
+	return 0;
+}
diff --git a/src/person.c b/src/person.c
new file mode 100644
index 0000000..3b22c3f
--- /dev/null
+++ b/src/person.c
@@ -0,0 +1,150 @@
+/**
+ * @author RookieHPC
+ * @brief Original source code at https://www.rookiehpc.com/mpi/docs/mpi_type_create_struct.php
+ **/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <mpi.h>
+ 
+/**
+ * @brief Illustrates how to create an indexed MPI datatype.
+ * @details This program is meant to be run with 2 processes: a sender and a
+ * receiver. These two MPI processes will exchange a message made of a
+ * structure representing a person.
+ *
+ * Structure of a person:
+ * - age: int
+ * - height: double
+ * - name: char[10]
+ *
+ * How to represent such a structure with an MPI struct:
+ *   
+ *           +----------------- displacement for
+ *           |        block 2: sizeof(int) + sizeof(double)
+ *           |               (+ potential padding)
+ *           |                         |
+ *           +----- displacement for   |
+ *           |    block 2: sizeof(int) |
+ *           |   (+ potential padding) |
+ *           |            |            |
+ *  displacement for      |            |
+ *    block 1: 0          |            |
+ * (+ potential padding)  |            |
+ *           |            |            |
+ *           V            V            V
+ *           +------------+------------+------------+
+ *           |     age    |   height   |    name    |
+ *           +------------+------------+------------+
+ *            <----------> <----------> <---------->
+ *               block 1      block 2      block 3
+ *              1 MPI_INT  1 MPI_DOUBLE  10 MPI_CHAR
+ **/
+ 
+// struct person_t
+// {
+//     int age;
+//     double height;
+//     char name[10];
+// };
+
+#define NMAX 100
+#define DATAMAX 1000
+#define DATAMIN -1000
+
+typedef struct Matrix {
+	int mat[NMAX][NMAX];	// Matrix cells
+	int row_eff;			// Matrix effective row
+	int col_eff;			// Matrix effective column
+} Matrix;
+
+void init_matrix(Matrix *m, int nrow, int ncol) {
+	m->row_eff = nrow;
+	m->col_eff = ncol;
+
+	for (int i = 0; i < m->row_eff; i++) {
+		for (int j = 0; j < m->col_eff; j++) {
+			m->mat[i][j] = 3;
+		}
+	}
+}
+
+void print_matrix(Matrix *m) {
+	for (int i = 0; i < m->row_eff; i++) {
+		for (int j = 0; j < m->col_eff; j++) {
+			printf("%d ", m->mat[i][j]);
+		}
+		printf("\n");
+	}
+}
+ 
+int main(int argc, char* argv[])
+{
+    MPI_Init(&argc, &argv);
+ 
+    // Get the number of processes and check only 2 processes are used
+    int size;
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    if(size != 2)
+    {
+        printf("This application is meant to be run with 2 processes.\n");
+        MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE);
+    }
+ 
+    MPI_Datatype mat_MPI;
+    int lengths[3] = { NMAX * NMAX, 1, 1 };
+ 
+    // Calculate displacements
+    // In C, by default padding can be inserted between fields. MPI_Get_address will allow
+    // to get the address of each struct field and calculate the corresponding displacement
+    // relative to that struct base address. The displacements thus calculated will therefore
+    // include padding if any.
+    MPI_Aint displacements[3];
+    Matrix dummy_matrix;
+    MPI_Aint base_address;
+    MPI_Get_address(&dummy_matrix, &base_address);
+    MPI_Get_address(&dummy_matrix.mat, &displacements[0]);
+    MPI_Get_address(&dummy_matrix.row_eff, &displacements[1]);
+    MPI_Get_address(&dummy_matrix.col_eff, &displacements[2]);
+    displacements[0] = MPI_Aint_diff(displacements[0], base_address);
+    displacements[1] = MPI_Aint_diff(displacements[1], base_address);
+    displacements[2] = MPI_Aint_diff(displacements[2], base_address);
+ 
+    MPI_Datatype types[3] = { MPI_INT, MPI_INT, MPI_INT };
+    MPI_Type_create_struct(3, lengths, displacements, types, &mat_MPI);
+    MPI_Type_commit(&mat_MPI);
+ 
+    // Get my rank and do the corresponding job
+    enum rank_roles { SENDER, RECEIVER };
+    int my_rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
+    switch(my_rank)
+    {
+        case SENDER:
+        {
+            // Send the message
+            Matrix buffer;
+            
+            buffer.row_eff = 4;
+            buffer.col_eff = 4;
+            init_matrix(&buffer,buffer.row_eff,buffer.col_eff);
+            printf("MPI process %d sends person:\n\t- ROW = %d\n\t- COL = %d\n\t-\n", my_rank, buffer.row_eff, buffer.row_eff);
+            MPI_Send(&buffer, 1, mat_MPI, RECEIVER, 0, MPI_COMM_WORLD);
+            break;
+        }
+        case RECEIVER:
+        {
+            // Receive the message
+            Matrix received;
+            MPI_Recv(&received, 1, mat_MPI, SENDER, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
+            printf("MPI process %d received person:\n\t- ROW = %d\n\t- COL = %d\n\t-\n", my_rank, received.row_eff, received.row_eff);
+            print_matrix(&received);
+            break;
+        }
+    }
+ 
+    MPI_Finalize();
+ 
+    return EXIT_SUCCESS;
+}
diff --git a/src/serial b/src/serial
new file mode 100644
index 0000000000000000000000000000000000000000..8405e5cb485403663d575d0118b9b239f66a299e
GIT binary patch
literal 21480
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

literal 0
HcmV?d00001

diff --git a/src/serial.c b/src/serial.c
index 94b6f16..0b57468 100644
--- a/src/serial.c
+++ b/src/serial.c
@@ -237,6 +237,8 @@ int main() {
 	// reads kernel's row and column and initalize kernel matrix from input
 	scanf("%d %d", &kernel_row, &kernel_col);
 	Matrix kernel = input_matrix(kernel_row, kernel_col);
+
+	
 	
 	// reads number of target matrices and their dimensions.
 	// initialize array of matrices and array of data ranges (int)
@@ -248,10 +250,23 @@ int main() {
 	for (int i = 0; i < num_targets; i++) {
 		arr_mat[i] = input_matrix(target_row, target_col);
 		arr_mat[i] = convolution(&kernel, &arr_mat[i]);
-		arr_range[i] = get_matrix_datarange(&arr_mat[i]); 
+		arr_range[i] = get_matrix_datarange(&arr_mat[i]);
+
+		printf("\nhmmmm\n");
+		print_matrix(&arr_mat[i]); 
+	}
+
+	// Print hasil
+	for (int i = 0; i < num_targets; i++) {
+		printf("\nMATRIX CONV %d",i);
+		printf("\nArray mat\n");
+		print_matrix(&arr_mat[i]); 
 	}
+	
 
 	// sort the data range array
+	printf("\n");
+	print_array(arr_range,num_targets);
 	merge_sort(arr_range, 0, num_targets - 1);
 	
 	int median = get_median(arr_range, num_targets);	
-- 
GitLab