2015-10-16 3 views
3
omp_set_num_threads(8); 
#pragma omp parallel for 
for(int tx = 0; tx < numThread; tx++) 
{ 
    cout<<"\nThread :"<<omp_get_num_threads()<<"\n"; 

} 

Я понимаю, что приведенный выше код должен напечатать 8. Но выход я получаюOpenMP код не работает параллельно

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Thread :1 

Пожалуйста, дайте мне знать, что происходит здесь не так. Я новичок в openmp, и поэтому я совершенно уверен, что, должно быть, совершил какую-то глупую ошибку.

Заранее спасибо

+0

Какой именно компилятор? – Jeff

+0

gcc (Ubuntu 4.8.4-2ubuntu1 ~ 14.04) 4.8.4 –

ответ

1

Я не уверен, что здесь происходит.

Это может быть случай, когда вы скомпилировали с помощью библиотеки OpenMP, которая предоставляет весь API библиотеки OpenMP, но работает только как последовательный режим (см., Например, this link для соответствующего коммутатора компилятора Intel).

Другая возможность заключается в том, что переменная среды OMP_THREAD_LIMIT установлена ​​в 1 в вашей среде. Смотрите, например этот код:

#include <iostream> 
#include <omp.h> 

int main() { 
    omp_set_num_threads(8); 
    #pragma omp parallel 
    #pragma omp single 
    std::cout << "Number of threads in the current parallel region is " << omp_get_num_threads() << std::endl; 

    return 0; 
} 

При компиляции с поддержкой OpenMP и запустить, это дает мне:

$ g++ -fopenmp nbthreads.cc -o nbthreads 
$ ./nbthreads 
Number of threads in the current parallel region is 8 
$ OMP_THREAD_LIMIT=1 ./nbthreads 
Number of threads in the current parallel region is 1 

Помимо этих двух возможностей, я понятия не имею.


Edit: благодаря Z boson «s комментарий, я уверен, что у меня есть ключ от тайны.

С тем же кодом, что и здесь ранее один, вот что я получил:

$ g++ -o nbthreads nbthreads.cc -lgomp 
$ ./nbthreads 
Number of threads in the current parallel region is 1 

Таким образом, вы просто по ошибке использовали -lgomp вместо -fopenmp во время компиляции/связывания коды. Это дает вам код OpenMP, эквивалентный только 1 потоку, даже если вы явно запрашиваете больше.

+0

Он говорит, что использует GCC. К сожалению, нельзя использовать только функции заглушки с GCC: это все или ничего. Вы можете сделать это с ICC и MSVC, а не с GCC. –

+0

@Zboson thx для примечания. Думаю, у меня есть это сейчас;) – Gilles

+0

Это интересно. Может, я тогда не прав? Если вы только ссылаетесь на '-lgomp', вы получаете только заглушки? Или, по крайней мере, у вас нет нитей? –

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