cuda编程
cuda
用于深度学习运算加速
并行计算
图像处理
推理、训练加速
神经网络、循环神经网络、卷积
cublas、cudnn、thrust
主要过程
- 分配host内存,并进行数据初始化;
- 分配device内存,并从host将数据拷贝到device上;
- 调用CUDA的核函数在device上完成指定的运算;
- 将device上的运算结果拷贝到host上;
- 释放device和host上分配的内存。
细节
硬件查看
int dev = 0;
cudaDeviceProp devProp;
CHECK(cudaGetDeviceProperties(&devProp, dev));
std::cout << "使用GPU device " << dev << ": " << devProp.name << std::endl;
std::cout << "SM的数量:" << devProp.multiProcessorCount << std::endl;
std::cout << "每个线程块的共享内存大小:" << devProp.sharedMemPerBlock / 1024.0 << " KB" << std::endl;
std::cout << "每个线程块的最大线程数:" << devProp.maxThreadsPerBlock << std::endl;
std::cout << "每个EM的最大线程数:" << devProp.maxThreadsPerMultiProcessor << std::endl;
std::cout << "每个SM的最大线程束数:" << devProp.maxThreadsPerMultiProcessor / 32 << std::endl;
使用GPU device 0: NVIDIA GeForce RTX 3090
SM的数量:82
每个线程块的共享内存大小:48 KB
每个线程块的最大线程数:1024
每个EM的最大线程数:1536
每个SM的最大线程束数:48
函数声明
__global__ : device执行,host调用,返回必须是void,不支持可变参数不能成为类成员函数,与
kernel异步
__device__ : 在device上执行,仅可以在device中调用,不能图global同时使用
__host__ : 在host上调用,不能和global但能和device同时使用,此时devic和global都会编译
在c++中声明函数后可以调用cuda里的__host__函数,通过__host__可以调用__global__核函数,实现host端控制device端的函数控制
内存管理(host调用)
cudaMalloc(&p, size()) //size以B为单位 sizeof(int) 是 4
cudaFree(p) //清理内存
cudaMemcpy(ptr1,ptr2, size(), cudaMemcpyHostToDevice)
-ptr2 到 ptr1 ,size长度, 最后方式,四种, 前置后置可分别为主机设备
优化方式
核函数并行
func<<<max_int, multi>>>(pragram);
-multi<=1024
共享内存
速度比寄存器慢一些,比存储器快多了
__shared__ int *p;
api
__cublas、 cudnn、thrust __
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/16442238.html