Насколько я понимаю, прочитав документацию Intel MKL и посты, подобные этой ... Вызов многопоточного MKL из параллельной области openmp - это то, что встраивание распараллеливания OpenMP в ваш собственный код AND Внутренний OpenMP MKL для таких функций MKL, как DGESVD
или DPOTRF
, невозможен без сборки с помощью компилятора Intel.Например, у меня есть большая линейная система, которую я хотел бы решить с помощью MKL, но я также хотел бы воспользоваться преимуществами распараллеливания для построения системной матрицы (мой собственный код, независимый от MKL) в том же двоичном исполняемом файле.
Intel заявляет в документации MKL, что сторонним компиляторам «возможно, придется отключить многопоточность» для функций MKL.Возможны следующие варианты:
- распараллеливание openmp вашего собственного кода (стандарт
#pragma omp ...
и т. Д.) И однопоточные вызовы ТОЛЬКО многопоточных вызовов MKL - , а такжеоднопоточный код везде
- использует компилятор Intel (я хотел бы использовать
gcc
, поэтому для меня это не вариант) - распараллеливать ваш код и MKL с Intel TBB?(не уверен, что это сработает)
Конечно, MKL поставляется с собственной openmp сборкой libiomp*
, с которой gcc
может ссылаться.Можно ли использовать эту библиотеку для достижения распараллеливания собственного кода в дополнение к функциям MKL?Я предполагаю, что будет вовлечено некоторое непосредственное управление потоками.Однако, насколько я могу судить, в MKL нет заголовков iomp
dev, которые могут ответить на этот вопрос (-> NO).
Так что на данный момент кажется, что единственный ответ - Intel TBB (Thread Building Blocks).Просто интересно, если я что-то упустил или есть хитрый обходной путь.
(Правка :) Другое решение может быть, если у MKL есть интерфейс для приема пользовательских лямбда-функций C ++ 11 или другого произвольного кода (например,содержащий вложенные циклы) для распараллеливания через любую используемую схему внутренней потоковой обработки.До сих пор я не видел ничего подобного.