
在银河麒麟KylinOS V10 SP1下利用CLion与CMake混合构建Qt6与CUDA程序
由于学校课程需求,需要在KylinOS下使用Qt框架进行应用程序开发,本文章根据以下项目尝试在KylinOS V10 SP1下利用CLion与CMake混合构建Qt6与CUDA程序。仓库地址:
AtomGIT: https://atomgit.com/iamnotdongyu/MCTS-Gobang
详细环境参照仓库README
该项目是一个基于蒙特卡洛树搜索算法的五子棋程序,为了提高搜索效率,使用CUDA实现了蒙特卡洛模拟部分的并行化模拟,故在项目中引入了CUDA代码,为了构建该项目,利用CMake将CUDA算子编译为动态链接库(静态库同理),将UI界面与后端逻辑编译为可执行文件,在执行文件中调用动态链接库。
项目路径如下:
- bin:动态链接库与可执行文件输出路径
- cuda:存放算子( *.cu )
- include:存放所有头文件( *.h *.cuh )
- source:存放左右CPP源文件( *.cpp )
- ui:存放Qt的UI文件( *.ui )
环境配置
由于CUDA与Qt的安装过于冗杂,本文省略这一部分的介绍,读者可以在其他文章中查询相关资料。
为了使CMake与CLion能够从环境变量中识别出Qt与CUDA,需要在/etc/profile
文件中写入以下条目(安装位置因人而异,注意替换):
# Qt6
export CMAKE_PREFIX_PATH="/home/用户名/Qt6.2.8/6.2.8/gcc_64:$CMAKE_PREFIX_PATH"
export Qt6_DIR="/home/用户名/Qt6.2.8/6.2.8/gcc_64/lib/cmake/Qt6"
# CUDA 12.8 Path
export CPATH="/usr/local/cuda-12.8/targets/x86_64-linux/include:$CPATH"
export PATH="/usr/local/cuda-12.8/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-12.8/lib64:$LD_LIBRARY_PATH"
注意:CLion并不会从~/.bashrc
中读取环境变量,如果在该文件中写入以上内容,只能通过Bash命令行来构建项目而非CLion的GUI操作。
在写入上述条目后记得执行source /etc/profile
并重启系统。
CLion构建
-
通过CLion打开项目,弹出向导:
点击左侧导航栏的“+”按键,会自动弹出一个Release配置,可根据个人需要选择。
点击右下角OK进入下一步。 -
转到
CMakeLists.txt
文件下,有以下内容:
cmake_minimum_required(VERSION 3.21)
project(Gomoku CXX CUDA)
# 基础设置
set(CMAKE_CXX_STANDARD 20)
set(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
set(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin")
# QtMOC设置
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
list(APPEND CMAKE_AUTOUIC_SEARCH_PATHS "${PROJECT_SOURCE_DIR}/ui")
# 环境依赖设置
find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
set(CMAKE_CUDA_ARCHITECTURES "86")
find_package(CUDAToolkit REQUIRED)
# 文件检索
file(GLOB SRC "${PROJECT_SOURCE_DIR}/source/*.cpp")
file(GLOB INC "${PROJECT_SOURCE_DIR}/include/*.h")
message("${INC}")
# 编译动态链接库
file(GLOB CuSRC "${PROJECT_SOURCE_DIR}/cuda/*")
add_library(CuRoll SHARED ${CuSRC})
target_include_directories(CuRoll PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_compile_options(CuRoll PRIVATE $<$<COMPILE_LANGUAGE:CUDA>:--default-stream=per-thread>)
set_target_properties(CuRoll PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
# 编译源文件,链接动态库
add_executable(Gomoku ${SRC} ${INC})
target_include_directories(Gomoku PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(
Gomoku PRIVATE
Qt6::Core
Qt6::Widgets
CuRoll
)
该构建文件指定了依赖项、QtMOC处理设置(为了自动化转译.ui为ui_xx.h)、头文件路径、编译输出路径、动态链接库设置等。
注意:由于QtMOC的某些问题,使用include_directories
宏命令指定头文件路径会导致无法通过编译,因此本项目中直接使用file
指令将所有头件打包至add_executable
中。
-
在CLion中右击
CMakeLists.txt
,选择“重新加载CMake”项目,即可生成构建所需文件(其实第一次打开项目会自动生成)
构建文件如下:
这部分文件无需操作,保证有该目录以及文件即可 -
点击右上角的"运行/调试配置"按钮
弹出动态链接库和可执行文件的编译选项:
点击右侧三个点后选择配置-编辑:
这里可以选择修改算子动态链接库的可执行文件为项目唯一输出的可执行文件Gomoku,这一操作会使得CuRoll配置可以一键同时编译 动态链接库CuRoll 与 可执行文件Gomoku 并 运行。点击应用后确定。 -
编译并运行程序
- 点击右上角的锤子按钮编译程序,此时会在bin目录下生成目标文件
Gomoku
与libCuRoll.so
- 点击右上角的绿色三角运行程序(其实点击这个会执行编译+运行两部操作),弹出程序运行界面
- 至此项目构建完成
利用NSight Compute检查GPU算子执行情况
- 在命令行使用以下命令以管理员权限打开NSight Compute(安装位置因人而异)
sudo /usr/local/cuda-12.8/nsight-compute-2025.1.0/host/linux-desktop-glibc_2_11_3-x64/ncu-ui
- 点击左侧菜单的default project
- 选择以下几个选项后点击右下角lunch(注意Application Executable选择刚刚编译到bin目录的Gomoku可执行文件)
、
- 在程序界面右下角选择“PVE”选项后点击“开始游戏”,执黑棋落子一个后等待AI落子,当AI完成落子后点击NSight的stop按钮即可
- 查看程序运行报告
利用鼠标滚轮可以放大时间轴,详细查看可以看到CPU多线程开启的多个不同流并行执行:
其中每个流执行的核函数共32*32=1024个线程,极限状态理论上会有24个流并行。
文章版权声明:本文由[iamnotdongyu]原创发布,版权所有。
未经书面授权,禁止任何单位及个人以任何方式进行转载、摘编、复制或建立镜像。违反上述声明者,将依法追究其相关法律责任。