3 параллельных региона - PullRequest
       17

3 параллельных региона

0 голосов
/ 09 марта 2011

Как я могу убедиться, что 3 фрагмента кода выполняются одновременно с OpenMP? В следующей игрушечной задаче секции A и B генерируют некоторые данные, а секция C опрашивает данные и воздействует на них.

int main(int argc, char* argv[])
{   
    int G = -1,S = -1;
    #pragma omp parallel sections default(none) shared(G,S,cout)
    {
        // Section A
        #pragma omp section
        {
            for(;;)
            {
                G = G_Generator();
                if(G == 0) break;
            }
        }
        // Section B
        #pragma omp section
        {
            for(;;)
            {
                S = S_Generator();
                if(S == 0) break;
            }
        }
        // Section C
        #pragma omp section
        {
            for(;;)
            {
                if(G == 1 || S == 1) Do_1();
                if(G == 2 || S == 2) Do_2();
                if(G == 0 || S == 0) break;
            }
        }
    }
return 0;
}

Это не работает, и я не могу отладить его. Возможно ли, что секция опроса C может «пропустить» значение G или S, равное 1 или 2? Кажется, код просто не дает желаемых результатов - это правильный путь для кодирования в OpenMP? Раньше я только распараллеливал циклы.

1 Ответ

2 голосов
/ 09 марта 2011

То, что вы хотите сделать, это конвейерный параллелизм, и будет трудно правильно синхронизировать.Если вам нужен какой-либо параллелизм, вам понадобится очередь (возможно, кольцевой буфер) для хранения данных, поступающих из секций A и B, пока секция C не будет готова для этого.Посмотрите на страницу 147 из http://www.openmp.org/mp-documents/omp-hands-on-SC08.pdf для одного примера, но это один производитель, один потребитель.

...