Многопоточный MKL + OpenMP, скомпилированный с GCC - PullRequest
0 голосов
/ 15 февраля 2019

Насколько я понимаю, прочитав документацию Intel MKL и посты, подобные этой ... Вызов многопоточного MKL из параллельной области openmp - это то, что встраивание распараллеливания OpenMP в ваш собственный код AND Внутренний OpenMP MKL для таких функций MKL, как DGESVD или DPOTRF, невозможен без сборки с помощью компилятора Intel.Например, у меня есть большая линейная система, которую я хотел бы решить с помощью MKL, но я также хотел бы воспользоваться преимуществами распараллеливания для построения системной матрицы (мой собственный код, независимый от MKL) в том же двоичном исполняемом файле.

Intel заявляет в документации MKL, что сторонним компиляторам «возможно, придется отключить многопоточность» для функций MKL.Возможны следующие варианты:

  1. распараллеливание openmp вашего собственного кода (стандарт #pragma omp ... и т. Д.) И однопоточные вызовы ТОЛЬКО многопоточных вызовов MKL
  2. , а такжеоднопоточный код везде
  3. использует компилятор Intel (я хотел бы использовать gcc, поэтому для меня это не вариант)
  4. распараллеливать ваш код и MKL с Intel TBB?(не уверен, что это сработает)

Конечно, MKL поставляется с собственной openmp сборкой libiomp*, с которой gcc может ссылаться.Можно ли использовать эту библиотеку для достижения распараллеливания собственного кода в дополнение к функциям MKL?Я предполагаю, что будет вовлечено некоторое непосредственное управление потоками.Однако, насколько я могу судить, в MKL нет заголовков iomp dev, которые могут ответить на этот вопрос (-> NO).

Так что на данный момент кажется, что единственный ответ - Intel TBB (Thread Building Blocks).Просто интересно, если я что-то упустил или есть хитрый обходной путь.

(Правка :) Другое решение может быть, если у MKL есть интерфейс для приема пользовательских лямбда-функций C ++ 11 или другого произвольного кода (например,содержащий вложенные циклы) для распараллеливания через любую используемую схему внутренней потоковой обработки.До сих пор я не видел ничего подобного.

1 Ответ

0 голосов
/ 15 февраля 2019

Intel TBB также обеспечит лучший вложенный параллелизм, что может помочь в некоторых случаях.Если вы хотите включить GNU OpenMP с MKL, есть следующие опции:

  • Динамический выбор интерфейса и слоя потоков .Связывает библиотеку mkl_rt, а затем
    • устанавливает env var MKL_THREADING_LAYER=GNU перед загрузкой MKL
    • или звонит mkl_set_threading_layer(MKL_THREADING_GNU);
  • Прямая связь с библиотеками потоков напрямую (хотя в ссылке нет явного упоминания GNU OpenMP).Это не рекомендуется при создании библиотеки, плагина или модуля расширения (например, пакета Python), которые можно смешивать с другими компонентами, которые могут по-разному использовать MKL.Ссылка на mkl_gnu_thread.
...