使用CLion进行cuda编程,并使用cuda-gdb对核函数进行debug,这可能是全网你能够找到的最详细的CLion和cuda编程环境配置教程了

news2024/12/24 0:21:16

文章目录

  • 前言
  • 一、环境准备
  • 二、相关学习资料
  • 三、环境配置
    • 1.新建Clion C++ Executable项目
    • 2.在Clion中的ToolChains中配置cuda-gdb
    • 3.配置CMake options
    • 4.配置CMakeLists.txt
      • (1) Failed to compute shorthash for libnvrtc.so
      • (2) c++: error: unrecognized command-line option '-G'
      • (3) Caffe2: CUDA cannot be found. Depending on whether you are building Caffe2or a Caffe2 dependent library, the next warning / error will give you more info.
      • (4) 在.cpp文件中导入torch时找不到torch
      • (5) 我的完整CMakeLists.txt内容
      • (6) Reload CMake后会有下面的输出
    • 5.cuda-gdb测试
      • (1) 创建test.cu和headers.h文件
      • (2) 在main.c中调用test_add函数
      • (3) 在设备函数中加入断点,调试核函数
  • 总结


在这里插入图片描述

前言

在确定了研究方向后,便开始着手研究相关的文献和Code,指导我看到了3D Gaussian Splatting。以往的DL工作的代码几乎都只建立在Python语言基础上,如果只是Python到还好,勉强还能看懂,但对于CUDA部分的C++代码,那是真看不懂了。而3DGS正是我接触CUDA编程的契机,使得我开始注重自己的全面发展,不想仅仅做一个DL农工,还需要研究一些更深入的东西,因此学习CUDA编程是有必要,而且学习CUDA编程也不亏,顺便把C++的知识也一并不上了。

虽然理想很丰满,但是光配置CUDA编程环境就快给我折磨死了,在没有人指导我的情况下,我断断续续用了快一个月才终于把环境给配置舒服,毕竟拥有一个趁手的工具,干起活来才舒服嘛!

本教程默认你对DL相关的环境配置已经很熟练,不然你也不会来学CUDA编程这种进阶的技术了。

一、环境准备

  1. Linux系统,必须的必须,Ubuntn就挺好的,不要用Win虚拟机装Linux,WSL虚拟机也不行,我踩过的坑你就别再往里跳了,Win开发就一托XX。本教程也默认你装好了Linux开发时所需要的一些重要依赖库
  2. Cuda和cudnn配置,这点默认你已经配置好了,同样下载比较新的cuda,太低版本的cuda不支持cuda-gdb,我用的cuda11.8
  3. CLion安装,也默认你已经安装好,CLion下载最新的2023版,Clion版本低不支持一些高版本的Cmake,当然你可以用低版本Clion和低版本Cmake
  4. Anaconda安装,并用conda创建好虚拟环境,
    conda create -n torch_cuda python=3.8
  5. (这一步可进行可不进行)理论上上面这些东西配置好了,就可以开始cuda的开发了,但我建议你把Pytorch也装好(版本不限,最好是比较新版本的torch,太低的怕出现奇怪的问题)。因为Pytorch自带libtorch,不需要你自己再单独下载,同时在C中可以直接导入torch库,方便调用torch提供的tensor等一系列函数,从而方便你进行pytorch+cuda+cpp进行开发。你可以参考我这篇blog:Pytorch CUDA CPP简易教程,在Windows上操作,Linux同理
    conda activate torch_cuda
    conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.6 -c pytorch -c nvidia

二、相关学习资料

  • CLion CUDA projects
  • Nvidia CUDA-GDB介绍
  • 葵佬 Pytorch+cpp/cuda extension 教學
  • INSTALLING PREVIOUS VERSIONS OF PYTORCH

三、环境配置

1.新建Clion C++ Executable项目

在这里插入图片描述

项目已经为你创建好了一个CMakeLists.txt文件
在这里插入图片描述

2.在Clion中的ToolChains中配置cuda-gdb

这一步如果你的gcc和g++没有安装,或者缺少别的库,Clion会提示找不到,因此还是要提前把Linux的必备运行库安装好。安装好会出现如下图所示的样子
在这里插入图片描述
这里的Debugger填写你自己配置好的Cuda自带的cuda-gdb,你可以参考我的路径找到cuda-gdb所在的位置,同时nvcc也在这个路径下,要记住后面要用,如果你不知道如何在本机安装多个版本的cuda,请参考这篇博客:linux非root安装特定版本的cuda。
在这里插入图片描述
/home/kpl/software/cuda-11.8/cuda/bin/cuda-gdb

/home/kpl/software/cuda-11.8/cuda/bin/nvcc

3.配置CMake options

在下图中的CMake options中填下这行命令,让CMake能够找到nvcc编译器,nvcc是专门用于编译核函数:

-DCMAKE_CUDA_COMPILER=/home/kpl/software/cuda-11.8/cuda/bin/nvcc

换成你自己的nvcc路径
在这里插入图片描述

4.配置CMakeLists.txt

我在配置CMakeLists.txt时遇到的问题是最多的,因为我一开始也不太明白这个文件到底该怎么写,它就像一门新的语言一样尤其固定的写法。通过这次经历也算是了解了CMakeLists.txt的基本写法。下面我按遇到的问题分步骤不断完善CMakeLists.txt。下面这些问题你可能有可能你碰不到,但写上也不会出错。

(1) Failed to compute shorthash for libnvrtc.so

在CMakeLists.txt开头加上下面内容:

find_package(PythonInterp REQUIRED)

(2) c++: error: unrecognized command-line option ‘-G’

这是因为C++没有-G这个编译选项,这个是nvcc才有的。-g表示主机(CPU)代码编译为可调式版本的,-G表示设备(GPU)代码编译为可调式版本。加入下面内容,才能够让nvcc正确编译设备代码:

set(CUDA_NVCC_FLAGS -g;-G)

(3) Caffe2: CUDA cannot be found. Depending on whether you are building Caffe2or a Caffe2 dependent library, the next warning / error will give you more info.

CMake找不到CUDA的位置,指定你安装好的CUDA_HOME,填入下面内容:

set(CUDA_TOOLKIT_ROOT_DIR /home/kpl/software/cuda-11.8/cuda)

(4) 在.cpp文件中导入torch时找不到torch

这里需要将pytorch提供的libtorch链接进你的cuda项目中
在CMakeLists.txt中加入下面内容:

set(CMAKE_PREFIX_PATH /home/kpl/software/Anaconda/Anaconda/envs/torch_cuda/lib/python3.8/site-packages/torch/share/cmake)
find_package(Torch REQUIRED)

/home/kpl/software/Anaconda/Anaconda/envs/torch_cuda这里的torch_cuda是我配置好的conda虚拟环境名,因此你可以按照我这个路径找到你自己使用conda安装好的环境位置,后面的lib/python3.8/site-packages/torch/share/cmake是一样的。

然后在文件最后一行添加下面内容,一定要写在add_executable后面

target_link_libraries(cuda_env ${TORCH_LIBRARIES})

(5) 我的完整CMakeLists.txt内容

find_package(PythonInterp REQUIRED)  # Failed to compute shorthash for libnvrtc.so
cmake_minimum_required(VERSION 3.24)
project(test)

set(CMAKE_CXX_STANDARD 17)
set(CUDA_NVCC_FLAGS -g;-G)  # c++: error: unrecognized command-line option '-G'
set(CUDA_TOOLKIT_ROOT_DIR /home/kpl/software/cuda-11.8/cuda)  
# Caffe2: CUDA cannot be found.  Depending on whether you are building Caffe2 or a Caffe2 dependent library, the next warning / error will give you more info.
set(CMAKE_PREFIX_PATH /home/kpl/software/Anaconda/Anaconda/envs/torch_cuda/lib/python3.8/site-packages/torch/share/cmake)
find_package(Torch REQUIRED)

add_executable(test main.cpp)
target_link_libraries(test ${TORCH_LIBRARIES})

(6) Reload CMake后会有下面的输出

在这里插入图片描述

不用管里面的warning,对运行代码没有任何影响

/home/kpl/software/Clion/clion-2023.2.2/bin/cmake/linux/x64/bin/cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_MAKE_PROGRAM=/home/kpl/software/Clion/clion-2023.2.2/bin/ninja/linux/x64/ninja -DCMAKE_CUDA_COMPILER=/home/kpl/software/cuda-11.8/cuda/bin/nvcc -G Ninja -S /home/kpl/software/Clion/Projects/cuda_env -B /home/kpl/software/Clion/Projects/cuda_env/cmake-build-debug
-- Found PythonInterp: /usr/bin/python3.10 (found version "3.10.12") 
-- The C compiler identification is GNU 11.4.0
-- The CXX compiler identification is GNU 11.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Found CUDA: /home/kpl/software/cuda-11.8/cuda (found version "11.8") 
-- The CUDA compiler identification is NVIDIA 11.8.89
-- Detecting CUDA compiler ABI info
-- Detecting CUDA compiler ABI info - done
-- Check for working CUDA compiler: /home/kpl/software/cuda-11.8/cuda/bin/nvcc - skipped
-- Detecting CUDA compile features
-- Detecting CUDA compile features - done
-- Caffe2: CUDA detected: 11.8
-- Caffe2: CUDA nvcc is: /home/kpl/software/cuda-11.8/cuda/bin/nvcc
-- Caffe2: CUDA toolkit directory: /home/kpl/software/cuda-11.8/cuda
-- Caffe2: Header version is: 11.8
-- Found CUDNN: /home/kpl/software/cuda-11.8/cuda/lib64/libcudnn.so  
-- Found cuDNN: v8.9.7  (include: /home/kpl/software/cuda-11.8/cuda/include, library: /home/kpl/software/cuda-11.8/cuda/lib64/libcudnn.so)
-- /home/kpl/software/cuda-11.8/cuda/lib64/libnvrtc.so shorthash is 672ee683
-- Autodetected CUDA architecture(s):  8.9
-- Added CUDA NVCC flags for: -gencode;arch=compute_89,code=sm_89
CMake Warning at /home/kpl/software/Anaconda/Anaconda/envs/torch_cuda/lib/python3.8/site-packages/torch/share/cmake/Torch/TorchConfig.cmake:22 (message):
  static library kineto_LIBRARY-NOTFOUND not found.
Call Stack (most recent call first):
  /home/kpl/software/Anaconda/Anaconda/envs/torch_cuda/lib/python3.8/site-packages/torch/share/cmake/Torch/TorchConfig.cmake:127 (append_torchlib_if_found)
  CMakeLists.txt:9 (find_package)


-- Found Torch: /home/kpl/software/Anaconda/Anaconda/envs/torch_cuda/lib/python3.8/site-packages/torch/lib/libtorch.so  
-- Configuring done (1.6s)
-- Generating done (0.0s)
-- Build files have been written to: /home/kpl/software/Clion/Projects/cuda_env/cmake-build-debug

[Finished]

5.cuda-gdb测试

(1) 创建test.cu和headers.h文件

kernel核函数只能写在.cu文件里,但是.cu文件既可以写主机代码也可以写GPU代码。
在这里插入图片描述
在这里插入图片描述
test.cu写入下面内容:

#include <stdio.h>

__global__ void add(int a, int b){
    int c = a + b;
    int d = c + a;
    printf("c: %d\n", c);
}

void test_add(int a, int b){
    add<<<1, 1>>>(a, b);
    cudaDeviceReset(); // 同步设备函数的结果
}

headers.h中写入下面内容:

#ifndef CUDA_ENV_HEADERS_H
#define CUDA_ENV_HEADERS_H

#endif //CUDA_ENV_HEADERS_H

void test_add(int a, int b);

(2) 在main.c中调用test_add函数

因为.c文件只能调用主机函数,因此不能不能直接调用add核函数,而.cu文件既可以写主机函数,也可以写设备函数,因此可以在.cu中写主机函数调用核函数,然后再在.c文件中调用.cu中的主机函数。

#include <iostream>
#include "headers.h"

int main() {
    int a = 1, b = 2;
    test_add(a, b);
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

run main.c查看是否正确执行代码,正确运行结果如下:
在这里插入图片描述

(3) 在设备函数中加入断点,调试核函数

切记:只有在核函数中加入断点才能进行核函数进行调试,没有办法使用Step into进入核函数
在这里插入图片描述
使用Step over 或者 Resume Program跳转到断点位置
在这里插入图片描述
如果你能复现出和我一样的结果,说明你成功开启了cuda-gdb,你可以爽快的进行cuda编程的开发辣!

总结

也许你看了我的blog,只需要用一个下午的时间就把我花了一个月踩的坑给跳过了,但是我仍愿意把我的经验分享出来,因为配置cuda编程环境的blog实在是太少辣,而且中文互联网的blog的质量太拉了,不知道大佬们是不是因为太不屑去写这玩意儿的配置教程,既然他们不愿意写那就让我这个菜鸡来写,让我来当这个第一人,如果对你有用点个赞或收藏吧。如果有写的不正确的地方欢迎评论

本人正在读Ph.D,就一般智力水平,研究方向是多视角立体(MVS)三维重建,欢迎相关研究的大佬们和我联系呀。如果你是仍处于DL或三维重建的入门阶段,我可能不是一个好的领路人,不过你可以看看我以往的blog,或许能给你启发。

GitHub:https://github.com/kangpeilun
Email:374774222@qq.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1301876.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第4章:知识融合:概述、方法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

数据库 02-03 补充的SQL的集合运算,字符串计算,更名计算

集合运算&#xff1a; 01.union&#xff0c;并运算 union运算自动去重&#xff0c;是包括两个集合的全部部分。 如果不要去重&#xff0c;union all 02.交运算&#xff0c;intersect intersect运算是去重&#xff0c;只保留两个集合的相同部分。 intersect all 保留重复…

分割均衡字符串 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只…

15:00面试,15:06就出来了,问的问题太变态了。。。

刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到5月一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还要降…

Spring Cloud切换内嵌Tomcat为宝兰德Application Server

目录 替换Tomcat中间件Tomcat是什么Spring Cloud剔除tomcat引入宝兰德Application Server打包运行授权 替换Tomcat中间件 Tomcat是什么 Apache Tomcat (called “Tomcat” for short) is a free and open-source implementation of the Jakarta Servlet, Jakarta Expression …

报错:AttributeError: ‘DataFrame‘ object has no attribute ‘reshape‘

这个错误通常发生在你试图在 Pandas DataFrame 上直接使用 reshape 方法时。reshape 方法通常与 NumPy 数组相关联&#xff0c;而不是 Pandas DataFrame。 如果你正在使用 Pandas DataFrame 并希望重新塑造它&#xff0c;你应该使用 Pandas 的重塑函数&#xff0c;如 pivot、m…

connection error;reply-code=503;unknown exchange type ‘x-delayed-message‘

错误原因 这个错误表明你的 RabbitMQ 服务器不认识交换机类型 “x-delayed-message”&#xff0c;这通常是因为你的 RabbitMQ 服务器没有启用 rabbitmq_delayed_message_exchange 插件&#xff0c;或者插件版本与你的 RabbitMQ 服务器不兼容。 解决方法 启用 RabbitMQ 延迟队…

Django 模型操作-分页(七)

一、连接MySql数据库 1、先安装MySQL 2、再安装MySQL驱动 使用mysqlclient pip install mysqlclient 如果上面的命令安装失败, 则尝试使用国内豆瓣源安装: pip install -i https://pypi.douban.com/simple mysqlclient 二、在settings.py中配置 三、 book表的数据…

MyBatis `saveBatch` 性能调优详解

文章目录 1. 引言2. MyBatis saveBatch 简介3. 常见性能问题3.1 SQL 语句拼接3.2 参数传递3.3 数据库连接数 4. MyBatis saveBatch 性能调优4.1 使用批量插入语句4.1.1 代码示例 4.2 使用MyBatis的foreach标签4.2.1 代码示例 4.3 使用VALUES构造器4.3.1 代码示例 4.4 调整批量大…

机器学习算法性能评估常用指标总结

考虑一个二分问题&#xff0c;即将实例分成正类&#xff08;positive&#xff09;或负类&#xff08;negative&#xff09;。对一个二分问题来说&#xff0c;会出现四种情况。如果一个实例是正类并且也被 预测成正类&#xff0c;即为真正类&#xff08;True positive&#xff0…

轻松通关Flink第24讲:Flink 消费 Kafka 数据业务开发

在上一课时中我们提过在实时计算的场景下&#xff0c;绝大多数的数据源都是消息系统&#xff0c;而 Kafka 从众多的消息中间件中脱颖而出&#xff0c;主要是因为高吞吐、低延迟的特点&#xff1b;同时也讲了 Flink 作为生产者像 Kafka 写入数据的方式和代码实现。这一课时我们将…

张驰咨询:掌握流程改进的关键,深入了解六西格玛绿带培训

尊敬的读者&#xff0c;当您寻求提升个人能力&#xff0c;加强企业流程管理时&#xff0c;六西格玛绿带培训无疑是您的不二选择。本文将带您深入了解六西格玛绿带培训的核心内容、必备工具和实际案例&#xff0c;以助您在职业生涯中一帆风顺。 六西格玛绿带培训主要针对中层管…

【SQL开发实战技巧】系列(四十八):Oracle12C常用新特性☞多分区操作和管理

系列文章目录 【SQL开发实战技巧】系列&#xff08;一&#xff09;:关于SQL不得不说的那些事 【SQL开发实战技巧】系列&#xff08;二&#xff09;&#xff1a;简单单表查询 【SQL开发实战技巧】系列&#xff08;三&#xff09;&#xff1a;SQL排序的那些事 【SQL开发实战技巧…

风险评估是什么,为什么被称为保护网络安全的重要一环!

随着互联网的普及和信息技术的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络在为我们带来便利的同时&#xff0c;也存在着各种安全风险。因此&#xff0c;进行网络风险评估是保护网络安全的重要一环。而为什么说风险评估是保护网络…

Gti GUI添加标签

通过Git Gui打开项目&#xff0c;通过菜单打开分支历史&#xff0c;我这里是名为"develop"的分支 选中需要打标签的commit&#xff0c;右键-Create tag即可 但貌似无法删除标签&#xff0c;只能通过git bash&#xff0c;本地标签通过git tag -d tagname&#xff0c;…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域&#xff0c;晶圆划片机作为一种先进的切割工具&#xff0c;正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺&#xff0c;晶圆划片机将LED陶瓷基板高效地切割成独立的芯片&#xff0c;为LED产业的快速发展提供了有力支持…

大数据分析与国际市场:跨境电商如何精准洞察需求

随着数字化时代的来临&#xff0c;大数据分析已经成为跨境电商的一项关键工具&#xff0c;为企业提供了更深入、更精准的市场洞察。在国际市场竞争激烈的环境中&#xff0c;了解和满足消费者需求是取得成功的关键。本文将探讨大数据分析在跨境电商中的作用&#xff0c;以及如何…

奇迹进化宝石怎么用

奇迹进化宝石的用法是: (一)先用再生宝石点在想要强化的物品上生成强化属性。 (二)点击进化石放到想要进化的具有强化属性的物品上。 进化过程存在一定概率的成功/失败&#xff0c;高级进化石的成功概率比低级进化石的成功概率低。 进化成功时&#xff0c;强化的属性会提高。…

配置本地端口镜像示例

目录 实验拓扑 组网需求 配置思路 配置步骤 1.配置观察端口 2.配置镜像端口 实验拓扑 组网需求 如实验拓扑所示 某公司行政部通过Switch与外部Internet通信&#xff0c;监控设备Server&#xff08;Router&#xff09;与Switch直连。 现在希望通过Server对行政部访…