2012-02-01 2 views
0

Я хочу, чтобы фрагмент кода был критичным для текущей команды потоков, а не глобальной критической. Как я могу это достичь ??Критическая область для потоков текущей команды

quick-sort(args) 
{ 
    spawn threads #x 
    { 
     critical-region 
     { 
      // code 
     } 
    } 
    quick-sort(args) 
    quick-sort(args) 
} 

Здесь критическая область с открытым mp будет блокировать все потоки перед доступом к критическому региону. Но у меня нет проблем с двумя потоками, входящими в критическую область, если они не порождаются одновременно. Я хочу решение для openMP.

ответ

1

Вы не можете сделать это с #pragma omp critical, но вы можете использовать OpenMP замки:

quick-sort(args) 
{ 
    declare an instance of OpenMP lock 
    omp_init_lock(the lock instance) 
    spawn threads #x 
    { 
     // critical-region 
     omp_set_lock(the lock instance) 
     { 
      // code 
     } 
     omp_unset_lock(the lock instance) 
    } 
    omp_destroy_lock(the lock instance) 
    quick-sort(args) 
    quick-sort(args) 
} 

Поскольку каждый вызов quick-sort объявит свой собственный объект блокировки, это даст вам то, что вы хотите.

Однако, из вашего псевдокода кажется, что у вас никогда не будет двух разных команд нитей, работающих одновременно, если в других функциях нет параллельных областей OpenMP. Если единственный код, который имеет параллельную область («порождает потоки»), находится в quick-sort, вам нужно будет иметь рекурсивный вызов этой функции из параллельной области, которой нет.

+0

спасибо .. специально для последней строки. Думаю, я выяснил причину замедления. –

Смежные вопросы