Поставщик Mono Mathnet MKL Nativer не найден

Я пытаюсь использовать собственный провайдер Mkl от mathdotnet с моно в Linux.

Я использую monodevelop и устанавливаю пакеты MathNet.Numerics и MathNet.Numerics.MKL.Linux-x64 и -x86 через сборку в диспетчере пакетов NuGet.

Когда я пробую этот код, я получаю System.NotSupportedException: собственный поставщик MKL не найден.

using System;
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.LinearAlgebra.Double;
using MathNet.Numerics;

namespace mdeveloptest
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Control.UseNativeMKL ();

            Matrix<double> a = DenseMatrix.OfArray(new double[,] { {1,2,3}, {4,5,6}, {7,8,9}});
            Matrix<double> b = DenseMatrix.OfArray(new double[,] { {1,2,3}, {4,5,6}, {7,8,9}});

            Console.WriteLine (a*b);

        }
    }
}

Пакеты MKL содержат файлы libiomp5.so и MathNet.Numerics.MKL.dll. В Windows было достаточно скопировать эти файлы в выходной каталог, но в Linux этого недостаточно.

Я также не уверен, нужен ли мне пакет x64 или x86 или моно как-то может выбрать правильный сам.


person Robert    schedule 10.07.2015    source источник


Ответы (2)


ldconfig Linux должен знать, где найти разделяемые библиотеки (*.so), даже если они находятся в текущем каталоге исполняемого файла. Если вы запускаете это моно-приложение из cmd и все ваши файлы (exe, dll и SO) находятся в текущем каталоге, вы должны:

export LD_LIBRARY_PATH=${PWD}:$LD_LIBRARY_PATH
mono mdeveloptest.exe

В MonoDevelop/Xamarin Studio:

  1. Откройте параметры проекта
  2. Перейдите на панель «Выполнить» / «Общие».
  3. Добавьте переменную среды

.

Variable        | Value
LD_LIBRARY_PATH | ./

К вашему сведению: я использовал ${PWD} в качестве переменных окружения XS/MonoDevelop, и они правильно расширяют оболочку, возможно, это связано с тем, как они цитируют строки. Поскольку плакат должен был использовать «./», я обновил ответ.

К вашему сведению: dyld OS-X по умолчанию включает текущий каталог, поэтому в этом случае не нужно устанавливать DYLD_LIBRARY_PATH.

Дополнительная информация:

Разрешение собственных сборок в Linux сильно отличается от Windows, просто поместить собственные библиотеки в ту же папку, что и исполняемый файл, недостаточно. Безопасный способ — отредактировать /etc/ld.so.conf и использовать ldconfig, чтобы указать, где искать библиотеки. В качестве альтернативы вы можете добавить путь к LD_LIBRARY_PATH или даже просто скопировать их в /usr/lib.

person SushiHangover    schedule 11.07.2015
comment
Большое спасибо, установка переменной LD_LIBRARY_PATH наконец сработала для меня. в monodevelop значение, похоже, не интерпретируется, переменная там просто устанавливается в строку ${PWD}. установив его на ./, тогда сработало. также как-то использование ldconfig у меня не сработало - person Robert; 14.07.2015
comment
Нет проблем, я обновил ответ с помощью ответа ./, так что, надеюсь, следующий человек найдет ответ. - person SushiHangover; 14.07.2015

Какую версию Math.NET Numerics вы используете? Начиная с версии 3.6 предполагается также явно смотреть в папку вывода, даже в Linux. Вы также можете установить Control.NativeProviderPath, чтобы он также смотрел на другой путь. И да, если вы поместите оба в подпапки x64 и x86, он автоматически выберет правильный. Подробнее см. в нашей документации по Intel MKL.

Конечно, вы также можете настроить его как общую библиотеку, как в Linux, с помощью ldconfig, см. Взаимодействие Linux с собственными библиотеками.

person Christoph Rüegg    schedule 11.07.2015
comment
привет, спасибо за помощь. я использую mathnet v3.7. Я попробовал Control.NativeProvierPath, ldconfig, поместив все в /lib и просто скопировав ibiomp5.so и MathNet.Numerics.MKL.dll в папку, содержащую файл .exe. Ничего не помогло, кроме установки переменной LD_LIBRARY_PATH. - person Robert; 14.07.2015