2012-04-18 4 views
3

Я просто попытался OpenMP с помощью простой программы грПочему работает программа OpenMP только в одном потоке

test() { 
    for(int i=0;i<100000000;i++); 
} 
main() { 
    printf("Num of CPU: %d\n", omp_get_num_procs()); 
    #pragma omp parallel for num_threads(4) 
    for(int i=0;i<100;i++) test(); 
} 

Составлено с g++ -fopenmp. Он может правильно распечатать, что у меня 4 процессора, но все тестовые функции работают на thread 0.

Я попытался изменить OMP_NUM_THREADS. Но это не имеет никакого эффекта.

У меня было все так же, как в онлайн-примерах, но почему бы мне не заставить его работать?

+3

Откуда вы знаете, что работает только один поток? – Antoine

+0

Да, я проверил в test(), распечатав omp_get_thread_num(). –

+0

Вы проверили 'omp_get_max_threads()', чтобы узнать, могут ли вещи openmp использовать только один поток по какой-то причине? – Grizzly

ответ

0

используйте функцию omp_set_num_threads (4) перед вызовом параллельной секции omp.

также, как вы определяете количество потоков? вставляйте свои printfs в критический раздел, чтобы убедиться, что все печатается.

6

Ваша проблема здесь:

#pragma omp parallel for num_thread(4) <--- 

Правильное положение является num_threads(4), не num_thread(4). Неправильные прагмы openmp игнорируются, и вы закончили с последовательной программой. :)

Я удивлен, что вы не получили предупреждение о компиляторе, потому что я это сделал.

+0

Спасибо и извините, это была опечатка. В коде у меня было num_threads (4), но до сих пор не повезло –

+0

@Eines He: Тогда это очень странно, потому что я вставил ваш код, скомпилировал его и запустил, и он работал на всех 4 ядрах. – Tudor

+0

Как вы настраиваете свою среду? Я думаю, что код довольно простой и не может ошибиться. Я использую g ++ 4.6.1 и libomp1. Я думаю, что openmp определенно работает, потому что у меня нет проблем с проверкой количества процессоров ... и т. Д. Это должно быть где-то, где я не правильно установил среду. –

0

Я столкнулся с той же ситуацией на рабочем столе ubuntu, когда расширяю модуль numpy с помощью кода C. openmp работает только с одним потоком. Мне пришлось удалить libopenblas-base и установить libatlas-base-dev (для решения проблемы с установкой numpy). Затем многопоточность openmp вернулась :)

Я протестировал его на сервере ubuntu с 64 ядрами, и он работает как мой рабочий стол! Я думаю, это связано с тем, что libopenblas конфликтует с библиотеками, такими как атлас.

1

У меня была эта проблема в визуальной студии, и, наконец, я понял, что забыл включить поддержку Open MP в визуальной студии. Это не дало мне никакой ошибки, но выполнило программу только для одного потока.

+0

http://supercomputingblog.com/openmp/getting-started-with-openmp-on-visual-studio/ –

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