Синхронизация типа master
Синхронизация типа master используется для определения структурного блока программы, который будет выполняться исключительно в главном потоке (параллельном потоке с нулевым номером) из всего набора параллельных потоков. Этот структурный блок следует за директивой
Назначение:
- Директива Masterописывает регион, который выполняется только главной нитью. Остальные (дочерние) потоки-нити пропускают данный участок кода.
- Эта директива не имеет определенных барьеров
Формат:
#pragma omp master newline structured_blockОграничения:
- Запрещаются переходы в блок или из блока Master
В примере показана программа, которая :
- выполняет одновременно всеми нитями функцию do_multiple_times;
- выполняет параллельную обработку цикла с синхронизацией нитей
- после синхронизации выполняет функцию нитью мастер
- выполняет параллельную обработку цикла без синхронизации нитей
- первая освободившаяся нить выполняет функцию one_time_any_thread
#pragma omp parallel
{
do_multiple_times(); // every thread calls this function
#pragma omp for
for (i=0; i<100;i++) // this loop is divided among the threads
fn1();
// implicit barrier at the end of the above loop
// will cause all thread to synchronize here
#pragma omp master
fn_for_master_only(); // only the master thread calls this function
#pragma omp for nowait
for (i=0; i<100; i++) // again, loop is divided among threads
fn2();
// The above loop does not have a barrier, and
// threads will not wait for each other. One thread,
// hopefully the first one done with the above loop,
// will continue and execute the code below.
#pragma omp single
one_time_any_thread();
}
Пример, показывающий разницу директив master и single.
void TestMaster()
{
int x[1000];
for (int i=0; i<1000; i++)
x[i]=i;
#pragma omp parallel shared(x) num_threads(10)
{
#pragma omp for nowait
for (int i=0; i<1000; i++)
// again, loop is divided among threads
x[i]+=i;
#pragma omp single
printf("Leader thread ID: %d\n",omp_get_thread_num());
#pragma omp barrier
#pragma omp for nowait
for (int i=0; i<1000; i++)
// again, loop is divided among threads
x[i]+=i;
#pragma omp master
printf("Master thread ID: %d\n",omp_get_thread_num());
}
}
Пример использования директивы для вывода промежуточных результатов
void TestMaster2()
{
int a[5], i;
#pragma omp parallel
{
// Perform some computation.
#pragma omp for
for (i = 0; i < 5; i++)
a[i] = i * i;
// Print intermediate results.
#pragma omp master
for (i = 0; i < 5; i++)
printf_s("a[%d] = %d\n", i, a[i]);
// Wait.
#pragma omp barrier
// Continue with the computation.
#pragma omp for
for (i = 0; i < 5; i++)
a[i] += i;
}
printf("\nResult\n”);
for (i = 0; i < 5; i++)
printf_s("a[%d] = %d\n", i, a[i]);
}
Дата добавления: 2015-02-03; просмотров: 832;