2

我正在尝试在 Linux 中使用来自 mathdotnet 的 Mkl 本机提供程序和单声道。

我正在使用 monodevelop 并通过 NuGet 包管理器中的构建安装了 MathNet.Numerics 以及 MathNet.Numerics.MKL.Linux-x64 和 -x86 包。

当我尝试这段代码时,我得到 System.NotSupportedException: MKL Native Provider Not Found。

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 包,或者单声道是否可以自行选择正确的包。

4

2 回答 2

1

Linux 的 ldconfig 需要知道在哪里可以找到共享库 (*.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 env var,并且它们正确扩展了 shell,这可能是它们引用字符串的方式。由于海报必须使用“./”,我更新了答案。

仅供参考:OS-X 的 dyld 默认包含当前目录,因此在这种情况下不需要设置 DYLD_LIBRARY_PATH。

附加信息:

本地程序集解析在 Linux 上与在 Windows 上非常不同,仅将本地库与可执行文件放在同一文件夹中是不够的。安全的方法是编辑 /etc/ld.so.conf 并使用 ldconfig 告诉在哪里查找库。或者,您可以将路径添加到 LD_LIBRARY_PATH,甚至只是将它们复制到 /usr/lib。

于 2015-07-11T04:19:31.270 回答
0

您使用的是哪个版本的 Math.NET Numerics?从 v3.6 开始,即使在 Linux 上,它也应该明确地显示在输出文件夹中。您也可以设置Control.NativeProviderPath使其查看另一条路径。是的,如果您将两者都放入一个x64x86文件夹,它会自动选择正确的一个。有关详细信息,请参阅我们的英特尔 MKL 文档

当然你也可以用 Linux 的方式将它设置为共享库ldconfig,参见Linux Interop with Native Libraries

于 2015-07-11T04:00:53.150 回答