2015-06-17 4 views
6

Я новичок, использующий процедуры LAPACK, поэтому я их не знаю, и я хочу использовать их в параллельных циклах (openmp).Безопасны ли подпрограммы LAPACK?

Я использую Ubuntu 14.04LTS и имею LAPACK, используя мой менеджер пакетов. Установленная версия является:

liblapack3 3.5.0-2ubuntu1  Library of linear algebra routines 3 - shared version 

Ассоциированный BLAS библиотека:

libblas3 1.2.20110419-7 

Итак, мой первый вопрос достаточно прост: я могу использовать любую подпрограмму или функцию LAPACK в цикле распараллеленные с использованием OpenMP ?. Id est, они потоки безопасны ?.

Другие вопросы: могу ли я использовать любую подпрограмму или функцию LAPACK в моей чистой подпрограмме ?, id est, в подпрограмме, закодированной мной и определенной как чистая.

Если ответ на эти вопросы «не со всеми процедурами LAPACK, но с некоторыми из них», то я могу сделать это с помощью следующих подпрограмм ?:

  • dgetrs
  • dgetrf
  • dgetri
  • dgecon

И один последний вопрос: есть ли процедуры LAPACK использовать все свои ядра ?, ID EST, они уже р arallel ?.

ответ

8

Ожидается, что библиотека LAPACK будет безопасной по потоку. Он не поддерживает несколько потоков, поэтому он не использует (все) ваши системные ядра. На самом деле существует конкретное заявление о том, что все подпрограммы LAPACK являются потокобезопасными с v3.3.

С другой стороны, LAPACK предназначен для использования подпрограмм библиотеки BLAS. Основной BLAS также не использует ни одного потока. Однако существует несколько популярных реализаций BLAS (ATLAS, OpenBLAS, MKL), которые имеют потоковые версии большинства подпрограмм BLAS. Если ваша библиотека LAPACK использует одну из вышеупомянутых библиотек BLAS, вполне возможно, что их подпрограммы начнут свои собственные потоки. Конечно, в вышеупомянутых библиотеках пользователь может контролировать количество используемых потоков. Вы можете ознакомиться со своей документацией, чтобы узнать, как это сделать.

Итак, вам нужно проверить, какую реализацию библиотеки BLAS вы используете, чтобы иметь четкое представление об использовании потока LAPACK.

Что касается использования внутри чистых функций, я хочу отметить, что оба BLAS и LAPACK печатают на экране конкретные сообщения об ошибках (stdout или stderr). Эти сообщения обычно связаны с ложным использованием подпрограммы, а не с математическими ошибками. Например, если вы попытаетесь инвертировать нулевую размерную матрицу. Если вы можете обеспечить это, то, возможно, вы можете сказать, что это чисто.

+1

И я вижу, что я не могу использовать их в функции _pure_. Я получаю следующую ошибку: 'Ошибка: вызов подпрограммы в 'dgetrs' at (1) не PURE' –

+0

Для справки: MKL предоставляет интерфейсы для чистых подпрограмм Fortran 95 https://software.intel.com/en-us/node/468670 – astrojuanlu