可以将 MKL 与 C++/WinRT 结合使用吗?

问题描述 投票:0回答:1

我想使用英特尔的数学核心函数库(MKL)来做一些计算。 我已经为 MFC 程序解决了这个问题,但我在使用 C++/WinRT 和 WinUI 3 程序时遇到了问题。 为了进行重现,我采用了标准的“空白应用程序,打包(桌面中的 WinUI 3)”应用程序并删除了 myProperty 的所有痕迹。 这是新的 MainWindow.cpp:

#include "pch.h"
#include "MainWindow.xaml.h"
#if __has_include("MainWindow.g.cpp")
#include "MainWindow.g.cpp"
#endif
#include "mkl.h"
#include <exception>
// Standard SYCL header
//#include "compiler\2025.0\include\sycl\CL\sycl.hpp"

using namespace winrt;
using namespace Microsoft::UI::Xaml;

namespace winrt::TestMKL::implementation
{
    MainWindow::MainWindow()
    {
        InitializeComponent();
    }
    void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        myButton().Content(box_value(L"Clicked"));
        // Test MKL
        // Example: Compute the dot product of two vectors
        double x[3] = { 1.0, 2.0, 3.0 };
        double y[3] = { 4.0, 5.0, 6.0 };
        double rv;
        try {
            rv = cblas_ddot(3, x, 1, y, 1);
        }
        catch (const std::exception& e) {
            OutputDebugString((L"MKL exception: " + to_hstring(e.what()) + L"\n").c_str());
        }
        OutputDebugString((L"Dot product: " + std::to_wstring(rv) + L"\n").c_str());
        result().Text(winrt::hstring{ std::to_wstring(rv) });
    }
}

没有更改其他代码。

您可以从https://github.com/dr-eck/MiniEditor

下载我的代码

要编译和链接代码,请执行以下操作:

  1. 安装 OneAPI 基础工具包
  2. 确保 ONEAPI_ROOT 指向 C:\Program Files (x86)\Intel\oneAPI\
  3. 将 $(ONEAPI_ROOT)\mkl\latest\include 添加到 C/C++ |一般|附加包含目录
  4. 将 $(ONEAPI_ROOT)\mkl\latest\lib 添加到链接器 |一般|其他图书馆目录
  5. 添加 mkl_intel_lp64_dll.lib;mkl_tbb_thread_dll.lib;mkl_core_dll.lib;到链接器 |输入 |额外的依赖项
  6. 将 mkl_blacs_lp64.2.dll、mkl_core.2.dll 和 mkl_tbb_thread.2.dll 复制到 x64\Debug\TestMKL\AppX 目录

即使您从 Github 存储库工作,也必须复制 DLL。

程序应该编译并运行。 单击该按钮后,该程序就会消失。 注释掉 MKL 代码可以验证如果不调用 cblas_ddot 程序不会消失。

我该如何进行这项工作?

winui-3 intel-mkl c++-winrt
1个回答
0
投票

在英特尔社区论坛上发表几轮帖子后,(https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Can-one-use-MKL-with-C-WinRT /m-p/1656600/thread-id/36818#M36839)我有部分答案。 使用 nmake,可以创建一个仅包含与通用 Windows 驱动程序 (UWD) 兼容的所需函数的 MKL 子集。 以下是文档链接:https://www.intel.com/content/www/us/en/docs/onemkl/developer-guide-windows/2025-0/using-the-custom-dll-builder-在命令行模式.html

以下是导出文本文件 (uwd_func_list.txt) 的示例:

cblas_dcopy
cblas_ddot
cblas_dgemm
cblas_dgemv
cblas_dnrm2
cblas_dscal
cblas_dswap
LAPACKE_dgesv
LAPACKE_dposv
LAPACKE_dsysv
LAPACKE_dpotrf
LAPACKE_dpotrs

这是我创建的用于运行 nmake 的 .bat 文件:

rem Set Visual Studio environment variables. LIB should have paths to desired OneCore.lib and universal crt libraries.
rem call "C:\Program Files (x86)\Intel\oneAPI\setvars-vcvarsall.bat" x64

rem add lib.exe folder to PATH
rem set path=%path%;"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\bin\Hostx64\x64"
rem add libcmt.lib folder to LIB
rem set lib=%lib%;"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.42.34433\lib\x64"
rem add mt.exe folder to PATH
rem set path=%path%;"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64"

rem Run custom dll builder script
rem nmake libintel64 interface=lp64 export=uwd_func_list.txt uwd_compat=yes crt=ucrt.lib name=mkl_uwd_compat
rem nmake "C:\Program Files (x86)\Intel\oneAPI\mkl\latest\share\mkl\tools\builder\makefile" interface=lp64 export=uwd_func_list.txt uwd_compat=yes crt=ucrt.lib name=mkl_uwd_compat
"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake" libintel64 interface=lp64 export=uwd_func_list.txt uwd_compat=yes crt=ucrt.lib name=mkl_uwd_compat

将 .txt 和 .bat 文件复制到 C:\Program Files (x86)\Intel\oneAPI\mkl\latest\share\mkl ools uilder 并运行 .bat。 它应该创建四个名为 mkl_uwd_compat.* 的文件、一个 DLL、一个清单、一个导出和一个库。

以这种方式创建的 DLL 和 .lib 文件允许我的应用程序编译、链接和运行。 唯一的缺点是 UWD 兼容性迫使应用程序以单线程运行,这从一开始就违背了使用 MKL 的目的。 当英特尔提出真正的解决方案时,我会更新此线程。

© www.soinside.com 2019 - 2024. All rights reserved.