printf("Thread %d is adding its iterations (%d) to sum (%d), ",
thread_id, priv_nloops, glob_nloops);
glob_nloops += priv_nloops;
printf(" total nloops is now %d.\n", glob_nloops);
}
}
printf("Total # loop iterations is %d\n",
glob_nloops);
return 0;
}
Transcribed Image Text:Program2: Critical Code
Using OpenMP you can specify something called a "critical" section of code. This is code that is performed by all
threads, but is only performed by one thread at a time (i.e. in serial). This provides a convenient way of letting you
do things like updating a global variable with local results from each thread, and you don't have to wory about
things like other threads writing to that global variable at the same time (a collision).
#include <stdio.h>
#include <omp.h>
int main (int argc, char *argv[])
{
int i, thread id;
int glob_nloops, priv_nloops;
glob_nloops = 0;
// parallelize this chunk of code
#pragma omp parallel private (priv_nloops, thread_id)
{
priv_nloops = 0;
thread id
omp_get_thread num();
/ parallelize this for loop
#pragma omp for
for (i=0; i<100000; ++i)
{
++priv_nloops;
}
// make this a "critical" code section
#pragma omp critical
{
printf("Thread %d is adding its iterations (%d) to sum (%d), ",
thread_id, priv_nloops, glob_nloops) ;
glob_nloops += priv_nloops;
printf(" total nloops is now %d.\n", glob_nloops);
}
printf("Total # loop iterations is %d\n",
glob_nloops);
return 0;
}
Expert Solution
This question has been solved!
Explore an expertly crafted, step-by-step solution for a thorough understanding of key concepts.