CUDA安装心得(从版本到安装VS2013+cuda8.0)
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;
}
- 在项目上右键 -> 生成依赖项 -> 生成自定义
如果有CUDA,则勾选
如果没有,则点击查找现有的 -> 进入以下目录,点击加入,然后再勾选。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\extras\visual_studio_integration\MSBuildExtensions - 修改.cu文件 右键 -> 属性 -> 项类型
7.修改语法
工具 -> 选项 -> 文本编辑器 -> 文件扩展名
在扩展名里填.cu,点击添加。改完后重启
8.测试CUDA
改成x64位的,运行(不改无法运行)。
运行成功的话,会得到下面的结果:
来源:CSDN
作者:八月85
链接:https://blog.csdn.net/milky85/article/details/104169599