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 __

posted @ 2022-07-04 11:05  InsiApple  阅读(132)  评论(0编辑  收藏  举报