我的课程笔记,欢迎关注:https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode
第一课: 如何在 PyTorch 中 profile CUDA kernels
这里是课程规划,有三位讲师 Andreas, Thomas, Mark,然后大概2周出一个 CUDA 主题的讲解以及工程或者结对编程的视频。课程讨论的主题是根据 《Programming Massively Parallel Processors》这本书来的,Mark 也是在8分钟的时候强推了这本书。另外在6分钟左右 Mark 指出,学习 CUDA 的困难之处在于对于新手来说,可能会陷入不断循环查找文档的状态,非常痛苦。
这里是说Lecture 1的目标是如何把一个 CUDA kernel 嵌入到 PyTorch 里面,以及如何对它进行 Profile 。相关的代码都在:https://github.com/cuda-mode/lectures/tree/main/lecture_001 。Mark 还提到说这个课程相比于以前的纯教程更加关注的是我们可以利用 CUDA 做什么事情,而不是让读者陷入到 CUDA 专业术语的细节中,那会非常痛苦。
这一页 Slides 中的代码在 https://github.com/cuda-mode/lectures/blob/main/lecture_001/pytorch_square.py
import torch
a = torch.tensor([1., 2., 3.])
print(torch.square(a))
print(a ** 2)
print(a * a)
def time_pytorch_function(func, input):
# CUDA IS ASYNC so can't use python time module
# CUDA是异步的,所以你不能使用python的时间模块,而应该使用CUDA Event
start = torch.cuda.Event(enable_timing=True)
end = torch.cuda.Event(enable_timing=True)
# Warmup (防止CUDA Context初始化影响时间记录的准确性)
for _ in range(5):
func(input)
start.record()
func(input)
end.record()
# 程序完成之后需要做一次 CUDA 同步
torch.cuda.synchronize()
return start.elapsed_time(end)
b = torch.randn(10000, 10000).cuda()
def square_2(a):
return a * a
def square_3(a):
return a ** 2
time_pytorch_functi