我想使用英特尔的数学核心函数库(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
下载我的代码要编译和链接代码,请执行以下操作:
即使您从 Github 存储库工作,也必须复制 DLL。
程序应该编译并运行。 单击该按钮后,该程序就会消失。 注释掉 MKL 代码可以验证如果不调用 cblas_ddot 程序不会消失。
我该如何进行这项工作?
在英特尔社区论坛上发表几轮帖子后,(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 的目的。 当英特尔提出真正的解决方案时,我会更新此线程。