OpenMP запускает потоки, но продолжает основной - PullRequest
2 голосов
/ 03 февраля 2012

Я пытаюсь использовать OpenMP для многопоточности, так как он кроссплатформенный. Однако я не могу понять, как сделать код после параллельного продолжения во время работы цикла? В основном он просто выполняет первый цикл параллельно, но никогда не попадает во второй непараллельный цикл?

int main() {
    #pragma omp parallel 
        while(1) {
            Sleep(4000);
            printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
        }


    while (1) {
        Sleep(4000);
        printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
    }
}

1 Ответ

3 голосов
/ 03 февраля 2012

Я думаю, вы могли бы просто сделать один из потоков вашим специальным потоком в параллельном блоке omp

int main() {
    #pragma omp parallel 
        if(omp_get_thread_num()==0){
             while(1) {
                Sleep(4000);
               printf("Hello from main %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
             }
        }else{
             while(1) {
                Sleep(4000);
                printf("doing work in thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
             }
         }
    }
}

Погода, которая имеет смысл в вашем случае, трудно судить без подробностей.* Вы также можете использовать sections.Пример отсюда: http://bisqwit.iki.fi/story/howto/openmp/#Sections:

#pragma omp parallel // starts a new team
{
   //Work0(); // this function would be run by all threads.

   #pragma omp sections // divides the team into sections
   { 
     // everything herein is run only once.
     { Work1(); }
     #pragma omp section
     { Work2();
       Work3(); }
     #pragma omp section
     { Work4(); }
   }

   //Work5(); // this function would be run by all threads.
}

Вы можете сделать вложенную ренационализацию: OpenMP: В чем преимущество параллелизации во вложении?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...