2012-12-08 22 views
6

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

12

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.