CUDA

image-20240514124728144

PCIe传输速率比较慢

image-20240514125248067

image-20240514134619194

image-20240514163840122

image-20240514164819180

CPU启动核函数之后,由这个核函数在GPU设备里产生的所有的线程构成了一个grid(网格)

而一个grid又由多个线程块(block)组成,一个线程块里包含一组线程(thread)

进行CUDA编程时,要做的就是减少计算核心空闲的时间,让计算核心一直处于计算中

CPU,GPU在进行内存相互访问的时候,会很耗时

image-20240514170821304

image-20240514200242464

image-20240514200453776

一维:

image-20240514215215578

image-20240514214149999

二维:

image-20240514214513695

三维:
image-20240515094438706

image-20240515094525884

image-20240515095616319

-arch和-code 都与GPU的兼容性有关,在指定计算能力的时候,GPU的真实架构计算能力一定要大于虚拟架构计算能力的

image-20240515100052890

image-20240515100901251

image-20240515101949472

image-20240515102254655

image-20240515104802323

即时编译,增加兼容性:

image-20240515104350368

两个都是compute_XY(虚拟)

image-20240518093831448

image-20240518094156107

在C++中,exit(-1)return -1 都可以用来表示程序的异常退出或者返回一个错误码,但它们之间有一些重要的区别:

  1. exit(-1) 是一个系统调用,它会立即终止整个程序的执行,并返回一个指定的退出码给操作系统。这会终止程序的执行并进行清理工作(如关闭文件、释放内存等),然后返回退出码。exit 函数是C标准库中的函数,定义在 <cstdlib> 头文件中。
  2. return -1 通常出现在函数中,用于从当前函数中返回一个指定的值。当函数的返回类型是整型时,return -1 将会将 -1 这个值返回给调用该函数的地方。如果 -1main 函数的返回值,那么它会被返回给操作系统作为程序的退出码。

因此,exit(-1) 会立即终止整个程序的执行,而 return -1 只是从当前函数中返回一个值。

image-20240518101534052

image-20240518102522434双指针

image-20240518102902454

image-20240518103123516

image-20240518103306357

cudaDeviceReset()函数用于重置当前设备上的所有状态信息。它会清除当前设备上的所有内存分配和设备端的运行时状态,释放所有CUDA资源,并将设备状态恢复到初始化时的状态。这个函数通常在程序结束前被调用,以确保释放所有CUDA资源并将GPU状态还原到初始状态。

调用cudaDeviceReset()函数可以帮助确保程序结束时释放了所有CUDA资源,从而避免内存泄漏和其他问题。

在CUDA中,核函数(kernel function)和设备函数(device function)是两个不同的概念。

  1. 核函数(Kernel Function):
    • 核函数是在GPU上执行的并行函数,由关键字__global__声明。它们可以被从CPU代码调用,并在GPU上并行执行。在CUDA中,核函数通常用于执行大规模数据并行计算。
  2. 设备函数(Device Function):
    • 设备函数是在GPU上执行的函数,但它们只能被其他设备函数调用,不能从CPU代码中直接调用。设备函数通常用于封装重复使用的代码逻辑,以便在核函数中进行调用,以提高代码复用性和可读性。

虽然它们都是在GPU上执行的函数,但核函数和设备函数在调用方式、用途和作用域上有明显的区别。核函数是CUDA程序中由CPU代码调用的入口点,而设备函数是为了在核函数内部使用而设计的。

image-20240518143353274

image-20240518145238232

image-20240518145441046

__FILE____LINE__ 是C/C++中的预定义宏,它们分别代表当前源文件的文件名和行号

image-20240518152527144

image-20240524144504885

%g 是 C++ 语言中的格式化输出控制符之一,用于打印浮点数。它根据浮点数的值自动选择 %f%e 中较短的一个输出形式来打印。

具体来说:

  • 如果浮点数的绝对值小于 0.0001 或者大于等于 10^6,%g 就会采用 %e 的输出形式,用科学计数法表示浮点数。
  • 否则,%g 会采用 %f 的输出形式,用普通的小数形式表示浮点数。

在 CUDA 编程中,cudaEventQuery(start) 表示查询事件 start 的状态。具体来说,它用于检查事件是否已经被记录。如果事件已经被记录,那么 cudaEventQuery 将立即返回。如果事件还没有被记录,那么 cudaEventQuery 将等待事件被记录后才返回。

在上述代码中,cudaEventQuery(start) 的目的可能是为了确保在记录 stop 事件之前,start 事件已经被成功记录。这样可以确保测量的时间间隔准确,避免了 start 事件尚未记录就立即记录 stop 事件的情况。

image-20240524163028697