折腾 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 KitCtrl + 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 调用成功了!在这个程序中,我们调用了 zeInitzeDriverGet 两个函数。前者用于初始化 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.