include #include #include #include #include


include <stdlib.h>

#include <stdio.h>

#include <omp.h>

#include <time.h>

#include <sys/time.h>

static const long Num_To_Add = 1000000000;

static const double Scale = 10.0 / RAND_MAX;

long add_serial(const char *numbers) {

    long sum = 0;

    for (long i = 0; i < Num_To_Add; i++) {

        sum += numbers[i];

    }

    return sum;

}

long add_parallel(const char *numbers) {

    long sum = 0;

    return sum;

}

int main() {

    char *numbers = malloc(sizeof(long) * Num_To_Add);

    long chunk_size = Num_To_Add / omp_get_max_threads();

#pragma omp parallel num_threads(omp_get_max_threads())

    {

        int p = omp_get_thread_num();

        unsigned int seed = (unsigned int) time(NULL) + (unsigned int) p;

        long chunk_start = p * chunk_size;

        long chunk_end = chunk_start + chunk_size;

        for (long i = chunk_start; i < chunk_end; i++) {

            numbers[i] = (char) (rand_r(&seed) * Scale);

        }

    }

    struct timeval start, end;

    printf(“Timing sequential…n”);

    gettimeofday(&start, NULL);

    long sum_s = add_serial(numbers);

    gettimeofday(&end, NULL);

    printf(“Took %f secondsnn”, end.tv_sec – start.tv_sec + (double) (end.tv_usec – start.tv_usec) / 1000000);

    printf(“Timing parallel…n”);

    gettimeofday(&start, NULL);

    long sum_p = add_parallel(numbers);

    gettimeofday(&end, NULL);

    printf(“Took %f secondsnn”, end.tv_sec – start.tv_sec + (double) (end.tv_usec – start.tv_usec) / 1000000);

    printf(“Sum serial: %ldnSum parallel: %ld”, sum_s, sum_p);

    free(numbers);

    return 0;

}

Looking for a Similar Assignment? Our ENL Writers can help. Use the coupon code FIRSTUVO to get your first order at 15% off!