Вызов последовательного intel mkl из цикла openmp - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я сталкиваюсь с проблемой производительности при вызове intel mkl внутри openmp l oop. Позвольте мне объяснить мою проблему более подробно после публикации упрощенного кода.

program Test
use omp_lib
implicit none
double complex, allocatable :: RhoM(:,:), Rho1M(:,:)
integer :: ik, il, ij, N, M, Y

M = 20
Y = 2000000
N = 500

allocate(RhoM(M,N),Rho1M(M,N))
RhoM = (1.0d0,0.0d0)
Rho1M = (0.0d0,1.0d0)

call omp_set_num_threads(4)

do il=1,Y
Rho1M = (0.0d0,1.0d0)
!$omp parallel do private(ik)
 do ik=1,N
  call zaxpy(M, (1.0d0,0.0d0), RhoM(:,ik:ik), 1, Rho1M(:,ik:ik), 1)
 end do
 !$omp end parallel do
end do    
end program Test

По сути, эта программа выполняет матричное суммирование на месте. Однако это не имеет никакого смысла, это просто упрощенный код. Я использую Windows 10 Pro и использую компилятор intel fortran (Версия 19.1.0.166). Я компилирую с: ifort -o Test.exe Test.f90 / fast / O3 / Qmkl: последовательный / debug: все libiomp5md.lib / Qopenmp. Поскольку «векторы», используемые zaxpy, не так велики, я попытался использовать openmp для ускорения программы. Я проверил время работы с помощью инструмента vtune от intel (вот причина флага отладки всех). У меня i5 4430, то есть 4 потока и 4 физических ядра.

Время с openmp: 107 с; Время без openmp: 44 с

Самое смешное, что с увеличением количества потоков программа работает медленнее. Vtune говорит мне, что используется больше потоков, однако время вычислений увеличивается. Это кажется очень противоречивым.

Конечно, я не первый сталкиваюсь с такими проблемами. Я приложу несколько ссылок и расскажу, почему это не сработало.

Intel предоставляет информацию о том, как выбирать параметры (https://software.intel.com/en-us/articles/recommended-settings-for-calling-intel-mkl-routines-from-multi-threaded-applications). Тем не менее, я связываюсь с последовательным Intel MKL. Если я попробую предложенные параметры с параллельным Intel MKL, я все еще буду медленным.

Кажется, важно включить omp_set_nested (1) ( Количество потоков функций Intel MKL внутри параллельных областей OMP ). Во-первых, этот параметр устарел. Когда я использую omp_set_max_active_levels (), я не вижу никакой разницы.

Возможно, это наиболее подходящий вопрос ( Вызов многопоточного MKL из параллельной области openmp ). Тем не менее, я использую последовательный Intel MKL и не заботиться о потоках MKL.

Этот здесь ( OpenMP распараллеливает несколько последовательных циклов ) говорит, что я должен попытаться использовать расписание. Я попробовал Dynami c и STATI c с разными значениями размера чанка, однако это не помогло вообще, так как объем работы, который должен быть сделан для потока, точно такой же.

Было бы очень хорошо, если у вас есть идея, почему программа замедляется из-за увеличения размера потока.

Если вам нужна дополнительная информация, пожалуйста, сообщите мне.

1 Ответ

0 голосов
/ 31 марта 2020

Кажется, это тот случай, когда openmp уничтожает и создает разбиение на потоки 2000000 раз. Это вызывает дополнительное вычислительное время. Смотрите сообщение от Эндрю (https://software.intel.com/en-us/forums/intel-fortran-compiler/topic/733673) и сообщение от Джима Демпси.

...