Dll 可以在同一流程中使用多个版本的MKL吗?

Dll 可以在同一流程中使用多个版本的MKL吗?,dll,intel-mkl,Dll,Intel Mkl,我们正在为Windows环境中的第三方应用程序开发一个插件(每个插件都是存储在预先指定的文件夹中的DLL文件)。该应用程序在内部使用“英特尔MKL 10.3.9.1”,并在其安装文件夹中附带MKL DLL 我们的插件DLL也依赖于MKL,但我们必须使用更高版本(11.1.3.1),因为我们使用VS2012(MKL的旧版本不支持它)。我们将MKL DLL放在plugin文件夹中,旁边是我们自己的DLL,它是根据上述版本的MKL构建的。这是我们的代码与MKL(在x64配置中)的链接方式: #prag

我们正在为Windows环境中的第三方应用程序开发一个插件(每个插件都是存储在预先指定的文件夹中的DLL文件)。该应用程序在内部使用“英特尔MKL 10.3.9.1”,并在其安装文件夹中附带MKL DLL

我们的插件DLL也依赖于MKL,但我们必须使用更高版本(11.1.3.1),因为我们使用VS2012(MKL的旧版本不支持它)。我们将MKL DLL放在plugin文件夹中,旁边是我们自己的DLL,它是根据上述版本的MKL构建的。这是我们的代码与MKL(在x64配置中)的链接方式:

#pragma注释(lib,“mkl_英特尔lp64_dll”)
#pragma注释(lib,“mkl\u英特尔线程\u dll”)
当应用程序运行时,它将从其文件夹中加载MKL 10.3 DLL。加载插件DLL时,看起来好像加载了MKL 11.1 DLL(至少访问了文件),但随后应用程序冻结(如果附加了调试器,我会看到访问冲突异常)。如果代码中依赖于MKL的部分被存根替换,有效地消除了对MKL的依赖,那么应用程序运行和使用插件就很好

我的猜测是,出现这些问题是因为我们的DLL希望与MKL 11.1一起工作,但实际上得到了以前加载的MKL 10.3(请注意,不同MKL版本的DLL具有相同的名称)


有人知道是否可以将两个不同版本的MKL加载到同一个进程中吗?

我通过以下步骤解决了这个问题,并允许我们的插件使用不同于宿主应用程序版本的MKL(受启发,参考-描述了一个不同但相关的场景):

  • 将MKL 11.1 DLL放在插件文件夹下的子文件夹中,名为
    Intel.MKL
    (而不是存储插件DLL的插件文件夹本身)

  • 在所述
    Intel.MKL
    文件夹中添加名为
    Intel.MKL.manifest
    的文件,该文件包含以下内容:

    插件确实返回了预期的版本(11.1)。

    附带说明,在添加清单依赖项后诊断DLL加载问题时,它被证明是一个非常有用的工具。