The master construct denotes a block that is only executed by the master thread. Note that there is no synchronization (implicit barrier) for the master construct. The other threads will skip over this block and continue processing without waiting for the master thread. Write a program that computes the average of a large array using a parallel for construct. While it is running using #pragma omp parallel for construct, also use a master construct (outside the for loop) to keep track of how many iterations have been executed and prints out a progress report. Q. The following code is what I have written so far, but the ave(rage) value at the end comes as zero, and the number of iteration was only one, which I don't think it reflects what this program is supposed to do. Please, modify my current code to meet the criteria explained above. #include #include #include #include #define NUM_THREADS 10 #define MAX 10 int main(int argc, const char* argv[]) { int i, iterated = 0; int vals[MAX]; float sum = 0.0; double start, delta; double ave = 0.0; omp_set_num_threads(NUM_THREADS); #pragma omp parallel { #pragma omp for for(i = 0; i < MAX; i++) { vals[i] = 10 + (rand() % 81); printf( " %d ", vals[i]); } #pragma omp for reduction(+:sum) for (i = 0; i < MAX; i++) sum += vals[i]; #pragma omp single { ave = sum / MAX; } #pragma omp master { ++iterated; printf("--- iteration: %d times ||| average: %d ---\n", iterated, ave); } } /* END OF MAIN */
Topic: OpenMP #pragma omp parallel for and #pragma omp master (Distributed and Parallel Computing Lab)
The master construct denotes a block that is only executed by the master thread. Note that there is no synchronization (implicit barrier) for the master construct. The other threads will skip over this block and continue processing without waiting for the master thread. Write a
Q. The following code is what I have written so far, but the ave(rage) value at the end comes as zero, and the number of iteration was only one, which I don't think it reflects what this program is supposed to do. Please, modify my current code to meet the criteria explained above.
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_THREADS 10
#define MAX 10
int main(int argc, const char* argv[]) {
int i, iterated = 0;
int vals[MAX];
float sum = 0.0;
double start, delta;
double ave = 0.0;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
#pragma omp for
for(i = 0; i < MAX; i++)
{
vals[i] = 10 + (rand() % 81);
printf( " %d ", vals[i]);
}
#pragma omp for reduction(+:sum)
for (i = 0; i < MAX; i++) sum += vals[i];
#pragma omp single
{ ave = sum / MAX; }
#pragma omp master
{
++iterated;
printf("--- iteration: %d times ||| average: %d ---\n", iterated, ave);
}
}
/* END OF MAIN */
Trending now
This is a popular solution!
Step by step
Solved in 3 steps with 1 images