折腾 NPU·第1章 —— 搭建 Level Zero 开发环境
在上一章 折腾 NPU·第0章 —— Intel NPU 概述与 Level-Zero 中,我们了解了 NPU 的概念以及 NPU 技术栈。本章将介绍如何在 VS Code 中搭建 Level-Zero 开发环境,以便我们在后续章节中编写 NPU 程序。
编译/构建工具准备
在 Windows 系统中,我们需要安装 VS Build Tools 和 CMake 作为编译和构建工具。CMake 可以通过 winget 安装:
winget install Kitware.CMake
VS Build Tools 则可以从 这里 下载,其包含了 MSVC 编译器 MSBuild 构建工具,类似于 Linux 中的 GCC 和 GNU Make。在安装时,我们需要勾选以下组件:
- MSVC v143 - VS 2022 C++ x64/x86 build tools
- Windows 11 SDK
- C++ (v143) Universal Windows Platform tools
- C++ CMake tools for Windows
- MSVC v143 - VS 2022 C++ x64/x86 Spectre-mitigated libs
由于 Level Zero 编译使用了 /Qspectre
选项,列表中的最后一个组件是必选的,否则会有编译错误。如果不慎遗漏了某些组件,后续也可以通过重新运行 VS Installer 进行添加。
VS Code 准备
为了方便开发,我们需要在 VS Code 中安装以下插件:
- CMake Tools (
ms-vscode.cmake-tools
) - C/C++ (
ms-vscode.cpptools
)
初始化项目
构建工具准备完成后,我们需要创建一个新的 CMake 项目 OneAPIDemo
。该项目包含两个简单的文件:
int main() {
return 0;
}
cmake_minimum_required(VERSION 3.10)
project(OneAPIDemo)
set(CMAKE_CXX_STANDARD 17)
add_executable(OneAPIDemo src/main.cpp)
随后,在 VS Code 中执行 CMake: Select a Kit
,选择 Visual Studio Build Tools 2022 Release - x86_amd64
,并按 Ctrl + F5
尝试运行。如果到此一切正常,我们的项目就已经准备好了。
当然,我们也可以不依赖 VS Code 的 GUI 操作,而是通过命令行来构建项目。具体说来,我们可以在项目根目录下执行:
cmake --build build -G "Visual Studio 17 2022"
cmake --build build --config Debug
以上两条命令分别对应于 Select a Kit
和 Ctrl + F5
的两个步骤。在构建完成后,我们同样可以在 build/Debug
目录下找到生成的可执行文件 OneAPIDemo.exe
。在调试时,VSCode 的快捷方式更加方便,但在 CI/CD 等场景下,命令行构建则更加适用,因此我们有必要了解其背后具体执行的命令。
准备 Level Zero 依赖
这里我们采用 Git Submodule 的方式引入 Level Zero 依赖。在项目根目录下执行:
git init
git submodule add https://github.com/oneapi-src/level-zero
git submodule add https://github.com/intel/level-zero-npu-extensions
这样一来,整个项目变成了自包含的形式,即项目自带所有的依赖库,其他人也因此可以快速构建项目,而不必担心依赖库的安装问题。下载完依赖后,我们需要在 CMakeLists.txt
中添加以下内容:
cmake_minimum_required(VERSION 3.10)
project(OneAPIDemo)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(./level-zero EXCLUDE_FROM_ALL)
add_executable(OneAPIDemo src/main.cpp)
target_include_directories(OneAPIDemo PUBLIC ./level-zero/include)
target_include_directories(OneAPIDemo PUBLIC ./level-zero-npu-extensions)
target_link_libraries(OneAPIDemo ze_loader)
cmake_minimum_required(VERSION 3.10)
project(OneAPIDemo)
set(CMAKE_CXX_STANDARD 17)
add_executable(OneAPIDemo src/main.cpp)
cmake_minimum_required(VERSION 3.10)
project(OneAPIDemo)
set(CMAKE_CXX_STANDARD 17)
add_subdirectory(./level-zero EXCLUDE_FROM_ALL)
add_executable(OneAPIDemo src/main.cpp)
target_include_directories(OneAPIDemo PUBLIC ./level-zero/include)
target_include_directories(OneAPIDemo PUBLIC ./level-zero-npu-extensions)
target_link_libraries(OneAPIDemo ze_loader)
测试程序
为测试 Level Zero 是否能正常工作,我们修改 src/main.cpp
:
#include <iostream>
#include <ze_api.h>
// 一个辅助检测返回值的宏
#define CHECK(result) \
do { \
auto _result = result; \
if (_result != ZE_RESULT_SUCCESS) { \
std::cerr << "failed at " << __FILE__ << ":" << __LINE__ \
<< "Code: " << _result << std::endl; \
exit(1); \
} \
} while (0)
int main() {
CHECK(zeInit(ZE_INIT_FLAG_VPU_ONLY | ZE_INIT_FLAG_GPU_ONLY));
uint32_t driverCount = 0;
CHECK(zeDriverGet(&driverCount, nullptr));
std::cout << "Driver count: " << driverCount << std::endl;
return 0;
}
如果看到输出 Driver count: 2
,则说明 Level Zero 调用成功了!在这个程序中,我们调用了 zeInit
和 zeDriverGet
两个函数。前者用于初始化 Level Zero,后者用于获取当前系统中的驱动数量。由于 Thinkbook 14p 2024 同时搭载了 GPU 和 NPU,Level Zero 能检测到的驱动数为 2
。
总结
这一章介绍了如何在 VS Code 中搭建 Level-Zero 开发环境,并通过一个简单的程序测试了 Level Zero 的调用。在下一章中,我们将继续介绍 Level Zero 的设计架构和 API,进一步观察 NPU 的功能使用。
作者:hsfzxjy
链接:
许可:CC BY-NC-ND 4.0.
著作权归作者所有。本文不允许被用作商业用途,非商业转载请注明出处。
OOPS!
A comment box should be right here...But it was gone due to network issues :-(If you want to leave comments, make sure you have access to disqus.com.