PCIe传输速率比较慢
CPU启动核函数之后,由这个核函数在GPU设备里产生的所有的线程构成了一个grid(网格)
而一个grid又由多个线程块(block)组成,一个线程块里包含一组线程(thread)
进行CUDA编程时,要做的就是减少计算核心空闲的时间,让计算核心一直处于计算中
CPU,GPU在进行内存相互访问的时候,会很耗时
一维:
二维:
三维:
-arch和-code 都与GPU的兼容性有关,在指定计算能力的时候,GPU的真实架构计算能力一定要大于虚拟架构计算能力的
即时编译,增加兼容性:
两个都是compute_XY(虚拟)
在C++中,exit(-1)
和 return -1
都可以用来表示程序的异常退出或者返回一个错误码,但它们之间有一些重要的区别:
exit(-1)
是一个系统调用,它会立即终止整个程序的执行,并返回一个指定的退出码给操作系统。这会终止程序的执行并进行清理工作(如关闭文件、释放内存等),然后返回退出码。exit
函数是C标准库中的函数,定义在<cstdlib>
头文件中。return -1
通常出现在函数中,用于从当前函数中返回一个指定的值。当函数的返回类型是整型时,return -1
将会将 -1 这个值返回给调用该函数的地方。如果-1
是main
函数的返回值,那么它会被返回给操作系统作为程序的退出码。
因此,exit(-1)
会立即终止整个程序的执行,而 return -1
只是从当前函数中返回一个值。
双指针
cudaDeviceReset()
函数用于重置当前设备上的所有状态信息。它会清除当前设备上的所有内存分配和设备端的运行时状态,释放所有CUDA资源,并将设备状态恢复到初始化时的状态。这个函数通常在程序结束前被调用,以确保释放所有CUDA资源并将GPU状态还原到初始状态。
调用cudaDeviceReset()
函数可以帮助确保程序结束时释放了所有CUDA资源,从而避免内存泄漏和其他问题。
在CUDA中,核函数(kernel function)和设备函数(device function)是两个不同的概念。
- 核函数(Kernel Function):
- 核函数是在GPU上执行的并行函数,由关键字
__global__
声明。它们可以被从CPU代码调用,并在GPU上并行执行。在CUDA中,核函数通常用于执行大规模数据并行计算。
- 核函数是在GPU上执行的并行函数,由关键字
- 设备函数(Device Function):
- 设备函数是在GPU上执行的函数,但它们只能被其他设备函数调用,不能从CPU代码中直接调用。设备函数通常用于封装重复使用的代码逻辑,以便在核函数中进行调用,以提高代码复用性和可读性。
虽然它们都是在GPU上执行的函数,但核函数和设备函数在调用方式、用途和作用域上有明显的区别。核函数是CUDA程序中由CPU代码调用的入口点,而设备函数是为了在核函数内部使用而设计的。
__FILE__
和 __LINE__
是C/C++中的预定义宏,它们分别代表当前源文件的文件名和行号
%g
是 C++ 语言中的格式化输出控制符之一,用于打印浮点数。它根据浮点数的值自动选择 %f
或 %e
中较短的一个输出形式来打印。
具体来说:
- 如果浮点数的绝对值小于 0.0001 或者大于等于 10^6,
%g
就会采用%e
的输出形式,用科学计数法表示浮点数。 - 否则,
%g
会采用%f
的输出形式,用普通的小数形式表示浮点数。
在 CUDA 编程中,cudaEventQuery(start)
表示查询事件 start
的状态。具体来说,它用于检查事件是否已经被记录。如果事件已经被记录,那么 cudaEventQuery
将立即返回。如果事件还没有被记录,那么 cudaEventQuery
将等待事件被记录后才返回。
在上述代码中,cudaEventQuery(start)
的目的可能是为了确保在记录 stop
事件之前,start
事件已经被成功记录。这样可以确保测量的时间间隔准确,避免了 start
事件尚未记录就立即记录 stop
事件的情况。