/* Shared Variables */
double x[1000000]; // Must be SHARED (accessed by worker threads !!)
int start[100]; // Contain starting array index of each thread
double min[100]; // Contain the minimum found by each thread
int num_threads;
int main(...)
{
for (i = 0; i < MAX; i++)
x[i] = random()/(double)1147483648;
#pragma omp parallel
{
// Note: we use omp_get_thread_num() to let a thread
// figure out by itself what portion of work to process
... Thread i finds its minimum and
... store the result in min[i]
}
// ----------------------------------------
// Post processing: Find actual minimum
// ----------------------------------------
my_min = min[0];
for (i = 1; i < num_threads; i++)
if ( min[i] < my_min )
my_min = min[i];
}
|
/* Shared Variables */
double x[1000000]; // Must be SHARED (accessed by worker threads !!)
int start[100]; // Contain starting array index of each thread
double min[100]; // Contain the minimum found by each thread
int num_threads;
int main(...)
{
for (i = 0; i < MAX; i++)
x[i] = random()/(double)1147483648;
#pragma omp parallel
{
int id;
int i, n, start, stop;
double my_min;
n = MAX/omp_get_num_threads(); // step = MAX/number of threads.
id = omp_get_thread_num(); // id is one of 0, 1, ..., (num_threads-1)
start = id * n;
if ( id != (num_threads-1) )
{
stop = start + n;
}
else
{
stop = MAX;
}
my_min = x[start];
for (i = start+1; i < stop; i++ )
{
if ( x[i] < my_min )
my_min = x[i];
}
min[id] = my_min; // Store result in min[id]
}
// ----------------------------------------
// Post processing: Find actual minimum
// ----------------------------------------
my_min = min[0];
for (i = 1; i < num_threads; i++)
if ( min[i] < my_min )
my_min = min[i];
}
|
Compile with:
Run with (on compute):
export OMP_NUM_THREADS=8
a.out
|
How to run the program:
|