查看电脑中GPU的型号
lspci | grep -i nvidia
yum install pciutils #安装lspic的命令
nvidia-smi #一款更好用的命令
nvidia-smi -L
cuda的安装(略)
查看cuda的版本
nvcc -V
cuda简介
在GPU上运行程序就要使用cuda,CUDA是NVIDIA公司所开发的GPU编程模型,它提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序。CUDA提供了对其它编程语言的支持,如C/C++,Python,Fortran等语言。
几个重要的概念
在CUDA中,有几个个重要的概念:
- host:host指代CPU及其内存
- device:device指代GPU及其内存。CPU的程序运行在内存中而GPU中的程序运行在显存(GPU的内存称为显存)中。
- kernel核函数:核函数是在GPU上运行的函数。主要有__global__和__device__两种
这两种函数都是在GPU上运行的,区别是__device__声明的函数可以有返回值,且可以被__global__和__device__调用,而__global__函数只能被CPU调用,且返回值只能是void。下面举个栗子:
#include<iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "device_functions.h"
using namespace std;
//被runGpu函数
__device__ double Sum(double*a){
return a[1] + a[2];
}
//被CPU调用
__global__ void runGpu(double *a){
a[0] = Sum(a);
}
int main()
{
double *A_gpu;
//申请显存
cudaMallocManaged(&A_gpu, 3*sizeof(double));
//显存初始化
for(int i =0;i<3;i++){
A_gpu[i] = 2;
cout<<" "<<A_gpu[i];
}
cout<<endl;
//开启GPU1个线程进行计算
runGpu<<<1,1>>>(A_gpu);
//等待GPU计算完毕,再访问显存
cudaDeviceSynchronize();
for(int i =0;i<3;i++){
cout<<" "<<A_gpu[i];
}
//释放线程
cudaFree(A_gpu);
return 0;
}
cuda常用的函数
cudaMallocManaged():申请显存
double *A_gpu;
cudaMallocManaged(&A_gpu, N*N*sizeof(double));
申请double类型N*N
cudaDeviceSynchronize()
在GPU在使用显存的过程中不允许CPU访问,CPU要等待GPU访问完以后再访问
cudaFree():释放显存
cudaFree(A_gpu);
<<<块数,线程数>>>
通过上面的栗子可以看到括号中的这两个参数乘积表示开启的总线程数。runGpu函数同时开启多个线程执行。
程序的编译
nvcc -std=c++11 test.cu -o test