• 【GPU编程】Visual Studio创建基于GPU编程的项目


    🍊前言

    cuda以及cudnn的安装以及系统环境变量的配置默认已经做完。如果没有安装好配置好的,可以参考其他的博客。本博客只为记录在完成以上配置后,如何在vs端创建GPU编程的项目。

    🐸方法一-CUDA Runtime生成

    我们打开vs,点击创建新项目:
    在这里插入图片描述
    然后在右侧选择到cuda runtime,具体是什么版本 看你装的是什么版本 因人而异:
    在这里插入图片描述
    创建完毕后,软件会自动生成一段基于GPU编程的代码,运行之后如果能正常出结果,说明你的CUDA安装和CUDNN的安装与系统环境配置没有问题了:
    在这里插入图片描述
    运行这个.cu后缀名的代码,得到结果:
    在这里插入图片描述
    则说明我们的第一个CUDA编程的代码跑通了。

    😝debug设置

    我们创建完项目之后,正常运行没问题的话,就可以开始完成我们的GPU编程了,但在写代码的过程中,难免会遇到bug,这时候如果我们想通过打断点的方式去调试,程序却无法在断点处终止,而是每次都执行完毕,这是因为我们创建的项目默认给我们设置了无法debug的模式,我们只需要点击项目:
    在这里插入图片描述
    打开项目属性:
    在这里插入图片描述
    把红箭头指向的地方选择是。
    在这里插入图片描述
    这边也同样将选择的地方选择成是。

    🍅方法二-空项目配置

    创建好之后,我们右键项目名称,选择生成依赖项,再选择生成自定义:
    在这里插入图片描述
    勾选我们想要的CUDA版本。
    点击空项目创建好项目之后,右键源文件,创建一个.cu为后缀名的代码文件:
    在这里插入图片描述
    名称自己随便定义。
    右键点击刚才创建好的.cu后缀名的文件,选择属性,点击常规,在项类型中选择CUDA C/C++即可:
    在这里插入图片描述
    然后打开项目属性页,开始配置路径:
    首先是包含目录:
    在这里插入图片描述
    然后是库目录:
    在这里插入图片描述
    然后是链接器的附加库目录:
    在这里插入图片描述
    然后,我们在桌面或者随便在哪个可以创建txt的地方,新建一个txt文件夹,命名为res.txt:
    在这里插入图片描述
    将这个txt复制到这个路径下:
    在这里插入图片描述
    打开终端,cd到这个路径里面,输入:

    DIR *.lib /B > res.txt
    
    • 1

    在这里插入图片描述
    然后我们再打开res.txt,则可以发现里面已经写入了这个路径下的所有lib依赖项的名字了。
    在这里插入图片描述
    然后我们复制所有的这些名称,拷贝到链接器-输入的附加依赖项中:
    在这里插入图片描述
    最后点击应用,然后确定。
    最后记得将这两个位置设置成一样的:
    在这里插入图片描述
    设置debug的方式见方法一的最后。

    🍉🍉🍉代码验证

    这里我们准备一串基于GPU编程的代码:

    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    //基于GPU的矢量求和
    #define N 10
    
    __global__ void add(int* a_ptr, int* b_ptr, int* c_ptr)
    {
    	int tid = blockIdx.x;
    	if (tid < N)
    	{
    		c_ptr[tid] = a_ptr[tid] + b_ptr[tid];
    	}
    }
    
    int main()
    {
    	/*std::vector a(N), b(N), c(N);
    	int* a_ = &a[0], * b_ = &b[0], * c_ = &c[0];*/
    	int a[N], b[N], c[N];
    	int* a_ptr, * b_ptr, * c_ptr;
    
    	//在CPU上分配内存
    	cudaMalloc((void**)&a_ptr, N * sizeof(int));
    	cudaMalloc((void**)&b_ptr, N * sizeof(int));
    	cudaMalloc((void**)&c_ptr, N * sizeof(int));
    
    	//在cpu上为数组赋值
    	for (int i = 0; i < N; i++)
    	{
    		a[i] = -i;
    		b[i] = i * i;
    	}
    
    	//将数组a和数组b复制到GPU上
    	cudaMemcpy(a_ptr, a, N * sizeof(int), cudaMemcpyHostToDevice);
    	cudaMemcpy(b_ptr, b, N * sizeof(int), cudaMemcpyHostToDevice);
    
    	//N表示在执行核函数时使用的并行线程块的数量。
    	add << <N, 1 >> > (a_ptr, b_ptr, c_ptr);
    
    	//将运算结果从GPU拷贝到CPU
    	cudaMemcpy(c, c_ptr, N * sizeof(int), cudaMemcpyDeviceToHost);
    
    	//显示结果
    	for (int i = 0; i < N; i++)
    	{
    		cout << a[i] << "+" << b[i] << "=" << c[i] << endl;
    	}
    
    	cudaFree(a_ptr);
    	cudaFree(b_ptr);
    	cudaFree(c_ptr);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    运行之后可以得到结果:
    在这里插入图片描述
    则说明基于GPU编程的项目创建成功了。

  • 相关阅读:
    如何长期有效维护客户关系,你真的了解你的客户吗?
    信息系统项目管理师必背核心考点(三十四)新七工具
    Spark 单机和集群环境部署教程
    回 溯 法
    Kafka为什么吞吐量高?
    【机器学习】支持向量机【上】硬间隔
    N字型变换
    一个非常简单的变分量子分类器 (VQC)
    Android学习笔记 73. 隐式intent
    密码锁屏 | 多御安全浏览器手机版还可以这样用
  • 原文地址:https://blog.csdn.net/ycx_ccc/article/details/133124849