Синхронизация типа 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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.011 сек.