Computer Engineering Question
Computer Science
The program provided first reads in a single integer (the number of elements in the arrays) and then reads in the elements of each array in turn. Two sample inputs are provided in the test_cases folder. To run the small sample input with 16 threads, the usage of your program should be ./omp_dot 16 < test_cases/omp_dot_small which should produce the output:
The dot product is 333833500 Time: ___sfile:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int n, tmp, i, sum;
if (argc != 2) {
printf(" %s Number_of_threads\n", argv[0]);
return -1;
}
int np = atoi(argv[1]);
if (np < 1) {
printf("Error: Number_of_threads (%i) < 1 \n", np);
return -1;
}
scanf("%d", &n);
int *a = malloc(n * sizeof(int));
int *b = malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {
scanf("%d", &b[i]);
}
omp_set_num_threads(np);
double start = omp_get_wtime();
/*
* You should replace the following loop with equivalent (but faster) OpenMP
* code.
*/
sum = 0;
#pragma omp parallel for shared(a, b, sum) private(i, tmp)
for (i = 0; i < n; i++) {
tmp = a[i] * b[i];
#pragma omp atomic
sum = sum + tmp;
}
double end = omp_get_wtime();
printf("The dot product is %d\n", sum);
printf("Time: %es\n", end - start);
return 0;
}
Step by step
Solved in 2 steps