All programs
PC - Lab Manual (Simplified) · BCS7O2 C

Problem Statement Program 1

Write an OpenMP program to sort an array of n elements using both Sequential Merge Sort and Parallel Merge Sort (using Sections). Record the difference in execution time.

C Code Source

program1.c
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>

#define MIN_SIZE 1000

void merge(int arr[], int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1;
    int n2 = right - mid;

    int *L = (int *)malloc(n1 * sizeof(int));
    int *R = (int *)malloc(n2 * sizeof(int));

    for (i = 0; i < n1; i++)
        L[i] = arr[left + i];

    for (j = 0; j < n2; j++)
        R[j] = arr[mid + 1 + j];

    i = 0;
    j = 0;
    k = left;

    while (i < n1 && j < n2) {
        if (L[i] <= R[j])
            arr[k++] = L[i++];
        else
            arr[k++] = R[j++];
    }

    while (i < n1)
        arr[k++] = L[i++];

    while (j < n2)
        arr[k++] = R[j++];

    free(L);
    free(R);
}

void mergeSortSequential(int arr[], int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        mergeSortSequential(arr, left, mid);
        mergeSortSequential(arr, mid + 1, right);

        merge(arr, left, mid, right);
    }
}

void mergeSortParallel(int arr[], int left, int right) {

    if ((right - left + 1) <= MIN_SIZE) {
        mergeSortSequential(arr, left, right);
        return;
    }

    if (left < right) {

        int mid = left + (right - left) / 2;

        #pragma omp parallel sections
        {
            #pragma omp section
            {
                mergeSortParallel(arr, left, mid);
            }

            #pragma omp section
            {
                mergeSortParallel(arr, mid + 1, right);
            }
        }

        merge(arr, left, mid, right);
    }
}

int main() {

    int n = 100000;

    int *arr_seq = (int *)malloc(n * sizeof(int));
    int *arr_par = (int *)malloc(n * sizeof(int));

    srand(time(0));

    for (int i = 0; i < n; i++) {
        arr_seq[i] = rand() % 10000;
        arr_par[i] = arr_seq[i];
    }

    printf("Sorting %d elements...\n\n", n);

    double start_time = omp_get_wtime();

    mergeSortSequential(arr_seq, 0, n - 1);

    double time_seq = omp_get_wtime() - start_time;

    printf("Sequential Merge Sort Time: %f seconds\n", time_seq);

    start_time = omp_get_wtime();

    mergeSortParallel(arr_par, 0, n - 1);

    double time_par = omp_get_wtime() - start_time;

    printf("Parallel Merge Sort Time: %f seconds\n", time_par);

    printf("\nDifference (Sequential - Parallel): %f seconds\n",
           time_seq - time_par);

    if (time_par > 0)
        printf("Speedup: %.2fx\n", time_seq / time_par);

    printf("\nVerification: First 20 elements of the sorted array:\n");

    for (int i = 0; i < (n < 20 ? n : 20); i++)
        printf("%d ", arr_par[i]);

    printf("\n");

    free(arr_seq);
    free(arr_par);

    return 0;
}

Output Console

Output
Sorting 100000 elements...

Sequential Merge Sort Time: 0.245317 seconds
Parallel Merge Sort Time:   0.102944 seconds

Difference (Sequential - Parallel): 0.142373 seconds
Speedup: 2.38x

Verification: First 20 elements of the sorted array:
0 2 6 7 10 13 15 19 21 22 25 27 29 31 33 35 37 38 39 42
Protected content · © VTU Developer · Unauthorised distribution is prohibited