2014-11-23 3 views
0

Я использую Ubuntu 14.04 x64 на компьютере с процессором Intel Xeon. и я испытываю странное поведение. У меня есть код Fortran, и длительная часть вычисления параллельна OpenMP. С меньшим набором данных (скажем, менее 4000) все работает нормально. Однако, когда я тестирую набор данных с 90 К элементами, в середине вычисления количество используемых потоков внезапно падает до 1, что, очевидно, замедляет вычисление.openmp число потоков меняется на код Fortran

Я уже делал эти проверки: Использование OMP_GET_NUM_THREADS() Я отслеживаю количество потоков во время процесса, и он растет одинаково даже после того, как система использует 1 поток.

Я использую процедуру LAPACK для вычисления собственного значения внутри цикла. Я снова собрал Lapack в своей системе, чтобы библиотеки в моей системе ничего не делали.

Может ли система изменять количество используемых потоков извне? Если да, то почему? Спасибо.

+0

Вы называете 'omp_set_num_threads' где угодно? –

+1

Tt выглядит как проблема балансировки нагрузки. Попробуйте с динамическим планированием: '! $ OMP PARALLEL SCHEDULE (DYNAMIC) –

+0

@ Энтони, спасибо. Это фиксировало это. Я думаю, что природа моих входных данных сделала это. – Strongman

ответ

2

Это похоже на проблему балансировки нагрузки. Попробуйте с динамическим планированием:

!$OMP PARALLEL SCHEDULE(DYNAMIC) 
+0

Вы можете уточнить, почему это решение проблемы. Например. что если время обработки входных данных (как указано в комментариях Q) не является однородным, то потоки не будут завершаться в одно и то же время и в особо плохих случаях, один поток может сохраняться намного дольше, чем другие. Динамическое планирование позволяет потокам лучше планировать работу с неравномерными нагрузками. – casey

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