CUDA C 编程/Nsight可视化

CUDA C

  • CUDA C 编程
    • 名词的意思
    • 1.0并行计算与GPU架构
    • 1.1 异构计算与CUDA
    • 2.1 CUDA编程模型(一)
    • 核函数计时
    • 组织并行线程
    • GPU设备信息
  • 使用Nvidia Profiler
    • Nsys
      • NVTX
      • 结合launch.py
    • Nsight Compute

CUDA C 编程

最近被安利到一个特别好的博客,看上去非常全面------>谭升的博客
相关书籍推荐---->书籍在blog的尾部

名词的意思

在读GNNAdvisor时,一直对里面的block,thread,warp概念不是很了解,后来才发现这是CUDA里面的一些专有名词。
可以简单参考------>CUDA编程——GPU架构,由sp,sm,thread,block,grid,warp说起
底下的讨论得知,一个SM只执行一个Warp,但是可以加载多个Warp?因为其他Warp可能处于其他状态(挂起,就绪,执行)。一个Warp中threads数量一定(32),一个block中threads数量不一定。
实际上同时执行的threads应该称为resident threads,数量是SM32。 active warp是指已经分配给SM的warp,并且该warp需要的资源(寄存器)也已经分配,这个warp的称为active warp,这个warp通过warp active_mask把此warp中的thread的active bit置1,active thread就是active warp32。

  • thread:一个CUDA的并行程序会被以许多个threads来执行。
  • block:数个threads会被群组成一个block,同一个block中的threads可以同步,也可以通过shared memory通信。
  • grid:多个blocks则会再构成grid。
  • warp:GPU执行程序时的调度单位,目前cuda的warp的大小为32,同在一个warp的线程,以不同数据资源执行相同的指令,这就是所谓 SIMT。

1.0并行计算与GPU架构

  • 延迟
  • 吞吐量
  • 带宽

1.1 异构计算与CUDA

异构计算
Hello,world–CUDA

2.1 CUDA编程模型(一)

编译cuda文件.cu

nvcc -arch sm_86 xxx.cu -o xxx(类似于exe)
./xxx

但是出现

The program ‘nvcc’ is currently not installed. You can install it by typing:
sudo apt install nvidia-cuda-toolkit

第一想法是nvcc没有在conda环境中装,于是在conda上装一下,参考nvcc_problem,所以是要装一个cudatoolkit-dev,参考git-cudatoolkit-dev,装一下即可。
其实正确的做法应该是找到系统安装的cuda路径,将环境变量配置好,nvcc环境在

/usr/local/cuda-11.1/bin

或者

whereis nvcc		

找到nvcc路径,加入即可。

C++文件include其他文件夹头文件,参考#include不同文件夹下头文件,但是需要注意是斜杠的方向。

核函数计时

在使用nvcc编译代码时,图方便就直接

nvcc xxx.cu xxx

结果出现

ERROR: sum_arrays_timer.cu:39,code:222,reason:the provided PTX was compiled with an unsupported toolchain.

搜了一下发现驱动程序和编译链不匹配,也没管直接把-arch 和sm参数加进去发现就可以了,没太懂-------------?
然后在计时和nsys的时候,第一遍按作者将memcpy DtoH 也加入了cpu计时器当中,使用nsys跑出来的结果

再将memcpy HtoD放在计时器外面,nsys结果

可以看到cpu计时器少去的时间正好是CUDA memory统计的时间,而后者的cpu计时与CUDA API统计的cudaLaunchKernel时间基本一致(按博文里说的这里应该会大一点,也非常符合),同时CUDA Memory统计的总时间与CUDA API统计的cudaMemcpy时间也是一致的,唯一有问题的就是CUDA kernel统计的时间,与哪个都对不上-----------------------?
(查文档)

组织并行线程

这里面需要了解

  • threadsIdx.x,threadIdx.y,:线程所在block的xy坐标
  • blockIdx.x,blockIdx.y,:block所在grid的xy坐标
  • blockDim.x,blockDim.y,:grid的维度
  • block.x,block.y:block的维度,上者在device中使用,这个在host中使用好像。。。

GPU设备信息

很多,有些不太懂,查文档

使用Nvidia Profiler

Nsys

关于nsys的具体用法及参数,可以参考Nsys documents–Nvidia
形式为

nsys [command_switch][optional command_switch_options][application] [optional application_options]

我刚开始用的是

/usr/local/cuda-11.1/bin/nsys profile --stats=true ./sum_arrays

可以自动生成.qdrep文件,该文件需要Nsight Systems来可视化,于是需要安装该软件进行本地查看。
--------->Nsys 可视化Mac
安装该blog一步步安装即可,这里面会出现mac权限的问题,按照教程
‘System Preferences’ → ‘Security & Privacy’ → ‘General’,然后点击允许打开即可。
最后将文件拖进去就可以查看,但是现在还有一些小问题,拖进去后会出现error,不影响观测,以后再解决吧。
参考知乎tensorflow profiling工具简介——nsight系列,后面还有nsight compute,下次再学着用吧。

NVTX

使用nvtx,由于我在conda environment下,所以需要安装nvtx

conda install -c conda-forge nvtx

然后在python文件中

import nvtx
nvtx.push//pop_range()#push命名,pop收集结束

最后

/usr/local/cuda-11.1/bin/nsys profile -t nvtx,osrt --force-overwrite=true --stats=true --output=quickstart python xxxx.py

即可在nsight system UI界面查看使用nvtx标记的部分
还会生成一个.sqlite文件,感觉没啥用,可以去sqlite online viewer查看具体内容。
同时也可以使用

with nvtx.annotate("name",color=""):

一般这两种方法就够了,具体可参考nvtx api。

结合launch.py

最近在想怎么profiler DGL launch.py的不同线程,想通过nsight system来查看,由于是多线程,通过上面链接通过nvtx查看server端和client端的情况,具体command

MKL_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 /usr/local/cuda-11.1/bin/nsys profile -t nvtx,osrt,cuda --stats=true --force-overwrite=true --output=multiprocessing python launch.py "/home/XXXXXXX/anaconda3/envs/torch/bin/python train_dist.py --graph_name reddit --ip_config ip_config.txt --num_gpus 1 --local_rank 0 --num_epochs 1 --batch_size 1000"

Nsight Compute

你可能感兴趣的:(cuda,c,cuda)