GPU高性能编程-CUDA

发布时间 2023-05-31 11:22:07作者: 0x7F
  • CUDA C只是对标准C进行了语言级的扩展,通过增加一些修饰符使编译器可以确定哪些代码在主机上运行,哪些代码在设备上运行
  • GPU计算的应用前景很大程度上取决于能否从问题中发掘出大规模并行性

核函数

  1. CPU以及系统内存成为主机,GPU及其内存成为设备
  2. GPU设备上执行的函数称为核函数(Kernel)
  3. 核函数调用时<<<para1,para2>>>中的para1表示设备在执行核函数时使用的并行线程块的数量,通俗来说总共将创建para1个核函数来运行代码,共para1个并行执行环境,para1个线程块。这para1个线程块称为一个线程格(Grid)
  4. 核函数中存在一个CUDA运行时已经预先定义的内置变量blockIdx,表示当前执行设备代码的线程块索引

函数

CUDA C提供了与C语言在语言级别上的集成,主机代码和设备代码由不同的编译器负责编译,设备函数调用样式上接近主机函数调用

指针

主机指针只能访问主机代码中的内存,设备指针只能访问设备代码中的内存

设备指针

虽然cudaMalloc()malloc()cudaFree()free()非常相似,但是设备指针同主机指针之间并不完全相同,设备指针的使用规则如下

  1. cudaMalloc()分配的指针可以传递给设备函数,设备代码可以使用该指针进行内存读/写操作(解引用)
  2. cudaMalloc()分配的指针可以传递给主机函数,主机代码不可以使用该指针进行内存读/写操作(解引用)

主机指针与设备指针数据拷贝

  1. 主机->主机:memcpy()
  2. 主机->设备:cudaMemcpy()指定参数cudaMemcpyHostToDevice
  3. 设备->主机:cudaMemcpy()指定参数cudaMemcpyDeviceToHost
  4. 设备->设备:cudaMemcpy()指定参数cudaMemcpyDeviceToDevice