CUDA安装配置心得

只谈情不闲聊 提交于 2020-02-06 00:17:44

CUDA是什么

CUDA(Compute Unified Device Architecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。

CUDA安装准备

一般要NVIDA的GPU才支持CUDA。在安装cuda前先要确定计算机是否有NVIDA的GPU和其适合的CUDA版本:

查看计算机是否有NVIDA的GPU

Win+R打开命令行,输入“dxdiag”。按确定。
在这里插入图片描述
显示如下界面,选择“呈现”(可能是“显示2”等,自己都点开来看一下)。就可以找到计算机的GPU信息。
在这里插入图片描述

查找计算机GPU适合的CUDA版本

控制面板->硬件和声音->NVIDIA控制面板->帮助->系统信息->组件
NVCUDA.DLL的产品信息就是CUDA可下载的最高版本。
在这里插入图片描述
上图计算机所适合的最高cuda版本为8.0.

Visual Studio版本

建议低版本的cuda使用低版本的VS(如果想用CUDA8.0,必须使用VS2015以下的VS版本),否则容易出现不匹配等故障。且在cuda安装前应先安装VS

下载CUDA

cuda8.0-ga2下载网址:https://developer.nvidia.com/cuda-80-ga2-download-archive
cuda9.0下载网址:https://developer.nvidia.com/cuda-91-download-archive
cuda10.2下载网址:https://developer.nvidia.com/cuda-downloads
想要什么版本把上述网址中间的“80-ga2”、“91”改成想要的版本即可。
以cuda8.0下载为例。
在这里插入图片描述
exe(network)为联网安装版本,exe[local]为离线安装版本。建议使用离线版本(exe[local])。

安装CUDA

双击下载的文件开始安装。安装CUDA就按照他的步骤来。
不要改变位置。
在这里插入图片描述
在这里插入图片描述可以选择精简版和自定义两种,可以自行选择(网上大部分选择自定义可自行搜索,我在安装cuda8.0的时候用自定义的安装失败,选择精简的安装成功了)。注:安装失败有很多原因,我安装失败时把原有的NVIDIA程序都删除掉再安装一遍就成功了。

安装成功后,打开命令行,输入“nvcc --version”
在这里插入图片描述
如图中显示则安装成功。

配置环境

1、创建空的普通的C++控制台项目
在这里插入图片描述
2、在项目上点击 右键->属性
修改以下属性(注意加分号):
(1)VC++目录 –> 可执行文件目录 –> 添加KaTeX parse error: Undefined control sequence: \bin at position 12: (CUDA_PATH)\̲b̲i̲n̲ ̲(2)VC++目录 –> 包含…(CUDA_PATH)\include
(3)VC++目录 –> 库目录 –> 添加$(CUDA_PATH)\lib
(4)链接器 –> 输入 –> 附加依赖项 –> 添加cudart.lib
在这里插入图片描述
3、添加.cu文件
右键点击源文件->添加->新建项
把名称直接改成.cu文件,如“test.cu”(下文用了CudaDemo.cu)。
在这里插入图片描述
4、把测试代码拷贝进去

#include <iostream>
#include <malloc.h>
#include <random>
#include <time.h>

#include "cuda.h"
#include "curand.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "curand_kernel.h" 
 
using namespace std;

cudaError_t addWithCuda(int* c, const int* a, const int* b, unsigned int size);

__global__ void MatrixMulKernle(int m, int n, int k, float* A, float* B, float* C)
{
	int Row = blockIdx.y * blockDim.y + threadIdx.y;
	int Col = blockIdx.x * blockDim.x + threadIdx.x;

	if ((Row < m) && (Col < k))
	{
		float Cvalue = 0.0;
		for (int i = 0; i < n; ++i)
			Cvalue += A[Row * n + i] * B[Col + i * k];
		C[Row * k + Col] = Cvalue;
	}
}

#define TILE_WIDTH 16  

int main()
{
	//这里将矩阵按照行优先转换成了一维的形式
	//实际中数组数量巨大,这里只是为了演示程序的过程
	float A[6] = { 11.4, 24, 33.5,   45, 55 ,32.4 }; //2×3的矩阵
	float B[12] = { 12,43,22.4, 31.3,  12,324,23,12,  44.4,23.4,65.3,73 };//3×4的矩阵
	float C[8] = { 0 }; //2×4的结果矩阵
	int m = 2, n = 3, k = 4;

	//分配显存空间
	int size = sizeof(float);
	float* d_a;
	float* d_b;
	float* d_c;
	cudaMalloc((void**)&d_a, m * n * size);
	cudaMalloc((void**)&d_b, n * k * size);
	cudaMalloc((void**)&d_c, m * k * size);

	//把数据从Host传到Device
	cudaMemcpy(d_a, A, size * 6, cudaMemcpyHostToDevice);
	cudaMemcpy(d_b, B, size * 12, cudaMemcpyHostToDevice);
	cudaMemcpy(d_c, C, size * 8, cudaMemcpyHostToDevice);

	//分配网格结构
	dim3 dimGrid((k - 1) / TILE_WIDTH + 1, (m - 1) / TILE_WIDTH + 1, 1);
	dim3 dimBlock(TILE_WIDTH, TILE_WIDTH, 1);

	//调用内核函数
	MatrixMulKernle << <dimGrid, dimBlock >> > (m, n, k, d_a, d_b, d_c);

	//将结果传回到主机端
	cudaMemcpy(C, d_c, size * 8, cudaMemcpyDeviceToHost);

	//输出结果
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 4; j++) {
			cout << C[i*4 + j] << ", ";
		}
		cout << endl;
	}

	//释放显存空间
	cudaFree(d_a);
	cudaFree(d_b);
	cudaFree(d_c);
	getchar();
	return 0;
}

  1. 在项目上右键 -> 生成依赖项 -> 生成自定义
    在这里插入图片描述
    如果有CUDA,则勾选
    在这里插入图片描述
    如果没有,则点击查找现有的 -> 进入以下目录,点击加入,然后再勾选。
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\visual_studio_integration\MSBuildExtensions
    在这里插入图片描述
  2. 修改.cu文件 右键 -> 属性 -> 项类型
    在这里插入图片描述
    7.修改语法
    工具 -> 选项 -> 文本编辑器 -> 文件扩展名
    在扩展名里填.cu,点击添加。改完后重启
    在这里插入图片描述
    8.测试CUDA
    改成x64位的,运行(不改无法运行)。在这里插入图片描述
    运行成功的话,会得到下面的结果:
    在这里插入图片描述
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!