有Cuda能力的GPU内核
当CUDA应用程序启动一个内核时,CUDA运行时会确定系统中每个GPU的计算能力,并利用这些信息自动寻找最适合该GPU的内核cubin文件或PTX版本(如果可用)。如果存在支持目标GPU架构的cubin文件,将直接使用它;否则,CUDA运行时将加载PTX代码,并在启动之前将其即时编译(JIT编译)为GPU的本机cubin格式。如果两者都不可用,则内核启动将会失败。
内核(kernel)是指在GPU上并行执行的功能。在CUDA编程中,内核是用来设计并利用NVIDIA GPU的强大并行处理能力的函数。编写CUDA程序时,你会定义一个或多个内核来执行可分解为大量并发任务的计算。这些内核并行处理大量数据,每个线程负责数据的一部分。
上述过程概述了CUDA如何在不同GPU架构上高效运行这些内核:
-
确定计算能力:运行时,CUDA运行时系统识别系统中每个GPU的具体计算能力(一个代表硬件特性和能力的版本号)。
-
匹配内核版本:利用这一信息,它寻找已为检测到的GPU架构编译的最佳版本的每个内核,无论是作为cubin(CUDA二进制)还是PTX(并行线程执行,一种类似中间汇编的语言)。
-
优先使用cubin:如果找到了完全针对GPU架构预编译的cubin文件,则直接加载并使用它。这提供了最优性能,因为运行时无需进一步编译。
-
PTX作为回退方案:如果没有找到匹配的cubin文件,系统则转而使用PTX代码。然后,由CUDA运行时将PTX即时编译为GPU的本机二进制格式,再启动内核。这种即时编译确保了即使没有为特定GPU架构预先编译cubin,也能保持兼容性。
-
内核启动失败:如果既没有兼容的cubin版本也没有PTX版本的内核可用,内核启动将会失败。
这种机制使CUDA应用程序能在不同GPU世代间保持可移植性,同时在可能的情况下受益于针对特定架构的优化。它还允许开发者在不为每种可能的GPU架构提供单独构建的情况下分发他们的应用程序,依靠PTX实现向前兼容性。