Критический регион для потоков текущей команды - PullRequest
0 голосов
/ 01 февраля 2012

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

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

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

1 Ответ

1 голос
/ 01 февраля 2012

Вы не можете сделать это с #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, вам потребуется рекурсивный вызов этой функции изнутри параллельной области, чего у вас нет.

...