2012-02-03 2 views
2

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

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()); 
    } 
} 
+0

вы не можете иметь рабочий поток работает после окончания «OMP параллельны» области (в вашем примере параллельной область первая «в то время как () {...} '. В конце параллельной области есть невидимый барьер (незадолго до второго). – osgx

+0

На самом деле, OpenMP - это плохой выбор для того, что вы хотите. Это не «другая потоковая библиотека», это другое решение с его собственными правилами. Лучшим решением было бы запустить отдельный поток (который мог бы использовать OpenMP), и позволить основному потоку перейти к «непараллельному» циклу. Более подробный ответ: pos если вы опишете пример использования более подробно. –

+0

@ АлексейКуканов, я согласен, но OpenMP имеет преимущества, описанные в вопросе. –

ответ

2

Я думаю, вы могли бы просто сделать один из потоков вашего специальный потока в пределах вашего 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: What is the benefit of nesting parallelizations?

+0

Спасибо, Johan. Я хочу добиться выполнения одного потока, который будет работать навсегда, но остальная часть основного кода должна продолжаться. Поэтому я хочу, чтобы основной поток и этот другой поток были параллельными, и они будут делать разные вещи. Это нормально работает с другими потоковыми библиотеками. Программа запускается (поток 0), тогда она порождает поток, чтобы делать материал, и код продолжается. – Mark

+0

Я понимаю это. Попробуйте использовать разделы. –

+0

Отличное спасибо! – Mark

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