我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?

Posted

技术标签:

【中文标题】我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?【英文标题】:Can I use C++ dll through Interop to offload to Xeon Phi? 【发布时间】:2014-12-05 00:57:15 【问题描述】:

我读到某些 c++ dll 可以自动卸载到 Xeon Phi,即使它们不是专门为使用多核而设计的..

我的问题 - 我可以使用来自 c# 的英特尔并行工作室来互操作一个 c++ dll 吗?希望它会自动卸载

【问题讨论】:

“即使它们不是专门为使用多核而设计的”是什么意思?有 DLL,可以自动卸载到 Xeon Phi,例如英特尔 MKL。很可能,这些库可以与 C++ 和 C# 链接。 英特尔工作室和一些开源编译器可以专门编译 C++ 以在 Phi 上运行(例如使用 pragma).. 所以我问是否可以从 C# 使用在没有明确 Phi 支持的情况下构建的 ddl。 HTH 当编译器编译 c++ 文件时,它会识别可以卸载的代码片段,然后将这些代码包装到对运行时库的一些调用中。无论是由编译指示标记,还是由编译器自动检测,它们都没有区别,最终的二进制文件(exec 或 dll)将是相同的。但是,目前还没有编译器可以执行这种自动卸载。 software.intel.com/en-us/articles/… “库可以选择”表示编写 MKL 库的开发人员编写了包含启发式的代码以确定最佳方法,然后根据该决定调用卸载或非卸载版本的例程.它被称为自动卸载,因为“计算的卸载对用户是透明的”。您说没有可以动态选择的“魔术”编译指示是正确的。该决定是在专门为该库编写的代码中做出的,并且开发人员付出了巨大的努力。 【参考方案1】:

我也对您关于 dll 能够自动卸载到英特尔至强融核协处理器的说法感到困惑,“即使它们不是专门为使用多核而设计的”。要自动卸载,库必须包含使用卸载指令的代码,并使用识别卸载指令的编译器进行编译。默认情况下,卸载指令会导致编译器同时生成处理器和协处理器可执行代码。

关于如何构建一个包含卸载代码的动态库,让我引用 Kevin Davis 在 software.intel.com 上的回复:

对于动态库,所有包含卸载语言扩展的源文件都必须使用 -fPIC 编译器选项进行编译。您在 IDE 下的属性设置下添加此选项: 配置属性 > C/C++ > 代码生成 [Intel C++] > MIC 卸载编译器的附加选项 …… 使用 icl 命令行时,动态库中包含卸载代码的每个源文件都必须使用 /Qoffload 选项编译以传递 -fPIC 选项。

存在一个限制,您不能在 dll 中使用 _Cilk_offload 指令,但我认为这是唯一的限制。

关于从 C# 调用包含卸载指令的库,英特尔® Parallel Studio XE 2015 中存在一个问题,该问题已在更新 1 中修复。但除了那个版本的编译器之外,您应该能够调用动态包含卸载指令的库。

【讨论】:

【参考方案2】:

有 DLL 可以自动卸载到英特尔至强融核,例如Intel MKL。这些库可以与 C++ 和 C# 链接(请参阅泡沫的答案)。

Automatic offload 在这种情况下意味着一个库包含一个代码,它允许卸载其计算,对用户透明。

此外,库可能包含一些代码,这些代码将决定是在 CPU 还是协处理器上运行计算。

【讨论】:

以上是关于我可以通过 Interop 使用 C++ dll 卸载到 Xeon Phi 吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法加载 DLL 'SQLite.Interop.dll

我可以使用 Silverlight 中的 Microsoft.Office.Interop.Word .dll 来操作 MSWord 的 SaveDialogFile 吗?

无法加载DLL'SQLite.Interop.dll

参考 Microsoft.Office.interop.access.dao.dll 导致错误 C#

“无法在客户端计算机上加载DLL'SQLite.Interop.dll'错误

如何引用 Microsoft.Office.Interop.Excel dll?