Mam kod w Fortranie, który używa DGESVD
z MKL i działa na 8 rdzeniach z kompilatorem Intel. Kod jest przyspieszany przez OpenMP. Również wiem, że OpenMP i MKL mają swoje własne ustawienia, aby ustawić liczbę wątków (omp_num_threads
i mkl_num_threads
). Chcę poznać optymalną liczbę wątków. Czy mam ustawić OMP_NUM_THREADS=1
przed wywołaniem procedury LAPACK? Czy liczba wątków OpenMP wpływa na liczbę wątków MKL?Gwintowanie OpenMP i MKL
Odpowiedz
MKL używa również OpenMP dla swojego sterownika wielowątkowego. Oznacza to, że liczba wątków OpenMP wpływa na liczbę wątków MKL, ale w bardzo zawiły sposób.
Po pierwsze, jako kod OpenMP, MKL jest również sterowany zwykłymi sposobami OpenMP w celu ustawienia liczby wątków, np. OMP_NUM_THREADS
i połączenia z numerem omp_set_num_threads
. Ale zapewnia również mechanizmy konfiguracji zastępowania w postaci MKL_NUM_THREADS
i mkl_set_num_threads()
. Dzięki temu można mieć różną liczbę wątków w kodzie użytkownika i procedurach MKL.
Po skonfigurowaniu żądanej liczby wątków, należy również wiedzieć, jak MKL zachowuje się w zagnieżdżonych przypadkach równoległości. Oznacza to, że MKL domyślnie uruchamia jednowątkowe, jeśli zostanie wywołany z wewnątrz aktywnego regionu parallel
w kodzie użytkownika. MKL udostępnia przełącznik MKL_DYNAMIC
, który może przesłonić to zachowanie, ale wymaga użycia tego samego kompilatora OpenMP dla kodu użytkownika, co dla MKL (czytaj - musisz użyć kompilatora Intela), ponieważ nie gwarantuje się kompatybilności pomiędzy różnymi środowiskami wykonawczymi OpenMP.
Ogólnie rzecz biorąc, nie trzeba ustawiać liczby wątków na 1 przed wywołaniem MKL, ponieważ spowoduje to, że będzie to jeden wątek, chyba że liczba wątków MKL zostanie nadpisana przez jej jawną konfigurację. Powinieneś zachować ostrożność, wywołując go z regionów parallel
, gdy włączona jest funkcja zagnieżdżania równoległego.
Więcej informacji na temat kontrolowania liczby wątków w MKL dostępne jest pod numerem MKL's User Guide.