Skip to content
Snippets Groups Projects
Commit 14f77bcd authored by Rehagana Sembiring's avatar Rehagana Sembiring
Browse files

add parallel to convolution

parent 78b5a6e6
Branches
No related merge requests found
......@@ -7,7 +7,8 @@
#include "./modules/headers/Matrix.h"
// main() driver
int main(int argc, char* argv[]) {
int main(int argc, char *argv[])
{
MPI_Init(NULL, NULL);
int my_rank;
......@@ -15,39 +16,52 @@ int main(int argc, char* argv[]) {
int kernel_row, kernel_col, target_row, target_col, num_targets;
int *arr_range;
Matrix* arr_mat;
Matrix *arr_mat;
Matrix kernel;
// reads kernel's row and column and initalize kernel matrix from input
if (my_rank == 0) {
if (my_rank == 0)
{
int thread_count = argc == 1 ? 1 : strtol(argv[1], NULL, 10);
scanf("%d %d", &kernel_row, &kernel_col);
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);
arr_mat = (Matrix*)malloc(num_targets * sizeof(Matrix));
arr_mat = (Matrix *)malloc(num_targets * sizeof(Matrix));
arr_range = malloc(num_targets * sizeof(int));
// read each target matrix, compute their convolution matrices, and compute their data ranges
for (int i = 0; i < num_targets; i++) {
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]);
}
int thread_count = argc == 1 ? 1 : strtol(argv[1], NULL, 10);
// read each target matrix, compute their convolution matrices, and compute their data ranges
#pragma omp parallel num_threads(thread_count)
{
int tid = omp_get_thread_num();
int nthreads = omp_get_num_threads();
for (int i = tid; i < num_targets; i += nthreads)
{
arr_mat[i] = convolution(&kernel, &arr_mat[i]);
}
}
#pragma omp parallel num_threads(thread_count)
#pragma omp parallel num_threads(thread_count)
{
int tid = omp_get_thread_num();
int local_n = num_targets/omp_get_num_threads(); // 11
int local_n = num_targets / omp_get_num_threads(); // 11
int local_a = tid * local_n;
int local_b = local_a + local_n;
for (int i = local_a; i < local_b; i++) {
for (int i = local_a; i < local_b; i++)
{
arr_range[i] = get_matrix_datarange(&arr_mat[i]);
}
if (tid == omp_get_num_threads()-1) {
for (int i = local_b; i < num_targets; i++) {
if (tid == omp_get_num_threads() - 1)
{
for (int i = local_b; i < num_targets; i++)
{
arr_range[i] = get_matrix_datarange(&arr_mat[i]);
}
}
......@@ -55,7 +69,8 @@ int main(int argc, char* argv[]) {
}
MPI_Bcast(&num_targets, 1, MPI_INT, 0, MPI_COMM_WORLD);
if (my_rank != 0) {
if (my_rank != 0)
{
arr_range = malloc(num_targets * sizeof(int));
}
MPI_Bcast(arr_range, num_targets, MPI_INT, 0, MPI_COMM_WORLD);
......@@ -63,16 +78,17 @@ int main(int argc, char* argv[]) {
// sort the data range array
merge_sort(arr_range, num_targets, MPI_COMM_WORLD);
if (my_rank == 0) {
if (my_rank == 0)
{
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("Nilai minimum: %d\nNilai maksimum: %d\nMedian: %d\nRata-rata di-floor: %d\n",
arr_range[0],
arr_range[num_targets - 1],
median,
floored_mean);
arr_range[0],
arr_range[num_targets - 1],
median,
floored_mean);
}
free(arr_range);
......
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