CUDA C/C++ 从入门到入土 第一步——让你的CUDA跑起来

CUDA C/C++ 从入门到入土 第一步——让你的CUDA跑起来

目录:

一. windows10+visual studio2019配置cuda记录

二. linux配置cuda代码记录

三. TODO: windows10 + vscode 配置cuda代码

一. windows10+visual studio2019配置cuda记录

1.1 下载Geforce Experience,将显卡驱动更新到上面最新

1.2. 桌面右键–>Nvidia控制面板->帮助->系统信息->组件

查看驱动支持的最高cuda版本:
image.png
可以看到我的是11.6.134,所以我可以安装这个版本及以下的cuda

1.3.下载、安装cudatoolkit

https://developer.nvidia.com/cuda-11-6-1-download-archive?target_os=Windows&target_arch=x86_64&target_version=10&target_type=exe_local

image.png
下载,如果想下其他版本,
image.png
点击第二个 “Archive of Previous CUDA Release”

注意:这个文件不用下载到C盘

双击下载好的文件进行安装,注意安装的时候选择自定义,然后取消驱动那一项(好像是第二个),特征是他会显示安装某个版本驱动,当前版本驱动是xx, 此时把这一项取消勾选,继续安装。建议装到默认的C盘吧,其实也不是很大。

1.4.下载、安装CUDNN

https://developer.nvidia.cn/rdp/cudnn-archive
image.png
点进对应的,我的就是第一个,选择下载带windows的,是一个zip文件,这个不用下载到C盘
解压该文件,提取其中的文件夹bin,lib,include,分别复制其中内容到“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.x”中的bin,lib/x64,include中.

添加环境变量
CUDA安装的时候是自动添加的但是CUDNN不是,
我的电脑右键->属性->高级系统设置->高级->环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OA6x9hbN-1657200094832)(https://upload-images.jianshu.io/upload_images/6387939-a769fcf4d04c1332.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

编辑,添加下面三个(最好先打开C盘,或者自己装的路径,找到这几个地址,如果找不到,就下载一个everything软件,用关键字在everything里搜索一下,找到路径了再粘贴过去):
image.png
确定->确定(直接关界面会不生效)

验证是否安装成功:
1.win+r -> 输入cmd进入命令行模式,依次输入(第二行依然建议先找到这个地址粘贴过来):

nvidia-smi
cd C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\demo_suite
deviceQuery.exe
bandwidthTest.exe

image.png
说明cuda安装完成

image.png

image.png

有result=pass 说明cudnn成功

1.5.配置vs:

打开一个空的c++控制台
image.png

image.png
换成x64,这个不改好像也没事

项目名右键->生成依赖项->生成自定义
勾选CUDA
image.png
项目名右键->属性->

image.png

第一行填写(也可以不用)
$(CUDA_PATH)
确定

(本处参考https://www.cnblogs.com/wansuiwht/p/15811478.html
在工程名上点击右键,选择添加——新建项。在新建项对话框中选择CUDA11.x,在右侧选择CUDA 11.x C/C++ File 文件名修改为main
image.png
复制下代码到main.cu,运行

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
__global__ void VecAdd(int* A, int* B, int* C)
{
	int i = threadIdx.x;
	C[i] = A[i] + B[i];
}
int main() {
	const int size = 3;
	int a[size] = { 1,2,3 };
	int b[size] = { 10,20,30 };
	int c[size] = { 0 };
	//定义设备变量
	int* dev_a = 0;
	int* dev_b = 0;
	int* dev_c = 0;
	//CUDA状态
	cudaError_t cudaStatus;
	//选择GUP
	cudaStatus = cudaSetDevice(0);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "选择GPU失败,您的电脑上没有GPU");
		return 0;
	}
	//分配GUP内存
	cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr, "dev_c内存分配失败");
	cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr, "dev_a内存分配失败");
	cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
	if (cudaStatus != cudaSuccess)
		fprintf(stderr, "dev_b内存分配失败");
	//从主机内存复制数据到GPU内存
	cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "dev_a复制失败");
	}
	//从主机内存复制数据到GPU内存
	cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "dev_b复制失败");
	}
	//调用GPU计算
	VecAdd << <1, size >> > (dev_a, dev_b, dev_c);
	//获取错误状态
	cudaStatus = cudaGetLastError();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "VecAdd 调用失败: %s\n", cudaGetErrorString(cudaStatus));
	}

	cudaStatus = cudaDeviceSynchronize();
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "cudaDeviceSynchronize 返回错误 %d!\n", cudaStatus);
	}
	//将计算结果返回主机
	cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
	if (cudaStatus != cudaSuccess) {
		fprintf(stderr, "从GPU复制数据失败!");
	}
	printf("{1,2,3} + {10,20,30} = {%d,%d,%d}\n",
		c[0], c[1], c[2]);
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);
	return 0;
}

如果成功,会显示
image.png
可以开始你的CUDA之旅啦!
编写好cuda代码后直接用visual studio编译、调试功能即可完成编译及调试

二. linux配置cuda代码记录

安装好cudatoolkit后,nvcc -V 会看到cuda版本,此时也说明nvcc可用,我们可以直接用nvcc编译cuda代码
可以直接用是因为Linux上还需要host compiler,例如Ubuntu的build-essential包。这个是linux自带的。

2.1 下载CUDATOOLKIT

进入官网 https://developer.nvidia.com/cuda-downloads 下载
image.png
image.png

下载runfile文件

cd runfile文件位置
sudo sh cuda_11.2.2_460.32.03_linux.run --override #指令前半部分和官网给的第二行一样

(注意如果没有override,有可能会报错)
运行后会卡一下,别急,这时候乱点可能电脑直接崩了,耐心等待一下。
弹出下一个界面选择continue
重点来了
runfile会自己再下一个CUDA驱动,但是本来已有驱动,所以会报错。在下一个界面取消勾选cuda driver(即第一个,方向键选中后回车取消,再方向键选中继续),过一会就装好了。
验证CUDATOOLKIT是否装好: nvcc -V
但是这时候还报错,因为还没有加入环境变量

sudo nano ~/.bashrc 
export LD_LIBRARY_PATH=/usr/local/cuda/lib
export PATH=$PATH:/usr/local/cuda/bin
source ~/.bashrc

如果创建了usr,要在usr自己~目录下也加入环境变量

2.2 下载cudnn

官网下载:
https://developer.nvidia.com/cudnn

tar -xvf cudnn...

先解压, 后将动态链接库和头文件放入相应目录

mv cuda/include/* /usr/local/cuda/include/
chmod +x cuda/lib64/* && mv cuda/lib64/* /usr/local/cuda/lib64/

安装完成以后,增加环境变量:

echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib64/:${LD_LIBRARY_PATH} \n" >> ~/.bashrc
source ~/.bashrc && ldconfig

2.3 命令行编译

单文件编译
nvcc  -arch=compute_x1 -code=sm_x2 hello_cuda.cu -o hello_cuda -run 

其中 -arch 是中间指令, -code是真实二进制指令,CUDA C编译器只负责编译到中间指令,后面的一步需要其他方式得到。需要注意:

  1. x1 <= x2
  2. x1,x2可用数值:35, 37, 50, 52, 53, 60, 61, 70, 72, 75, 80, 86
  3. x1,x2数值和机器架构相关,例如:
    在这里插入图片描述
    在这里插入图片描述
  4. 如果不指定-arch 和 -code,则会默认当前cuda支持最高的机器。
多文件编译
nvcc --device-c a.cu -o a.o
nvcc a.o b.cu -o b
./b

对–device-c的解释:
–可以直接理解成CPU上的-c, 因为CUDA 3.2之前的问题,导致了rdc的出现(3.2以前的CUDA要求跨文件隔离kernel和符号),所以-c变成了-rdc=true -c, 最终变成了-dc(–device-c)

2.4 利用makefile编译

TEST_SOURCE = hello_cuda02-test.cu

TARGETBIN := ./hello_cuda_multi_file

CC = /usr/local/cuda/bin/nvcc


$(TARGETBIN):$(TEST_SOURCE) hello_from_gpu.o
	$(CC)  -arch=compute_72 -code=sm_72 $(TEST_SOURCE) hello_from_gpu.o -o $(TARGETBIN)

hello_from_gpu.o:hello_from_gpu.cu
	$(CC) -arch=compute_72 -code=sm_72 --device-c hello_from_gpu.cu -o hello_from_gpu.o

.PHONY:clean
clean:
	-rm -rf $(TARGETBIN)
	-rm -rf *.o

对makefile解释:

  1. = 及 := 可理解为幅值
  2. 本质上makefile是执行$(CC)那一行的指令(用makefile文件实现2.1中利用命令行进行编译),在$(CC)上方记得写明编译生成的文件及对应依赖的文件
  3. 可以看到makefile按照层级,先执行$(CC) -arch=compute_72 -code=sm_72 --device-c hello_from_gpu.cu -o hello_from_gpu.o生成hello_from_gpu.o,随后利用生成的hello_from_gpu.o和(若是必要,别的依赖的需要编译的文件)一起编译生成最后的可执行文件

三. TODO: windows10/linux + vscode 配置cuda代码

vscode相比vs,有很多插件,拥有强大的功能。另外vs每次必须生成一个solution,非常臃肿(但是大项目比较好用),而且linux只有vscode没有vs,因此等楼主考完试好好睡一觉了之后再来更新怎么用vs和cmake编译cuda代码。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值