准备部署:
测试CUDA可用性:
部署CUDA应用程序时,通常需要确保即使目标计算机没有支持CUDA的GPU和/或已安装足够版本的NVIDIA驱动程序,应用程序仍能正常运行。
检测具有CUDA功能的GPU:
当应用程序将被部署到目标机器的任意/未知配置时,应用程序应该明确地测试是否存在CUDAcapable GPU,以便在没有此类设备可用时采取适当的操作。 cudaGetDeviceCount()函数可用于查询可用设备的数量。 与所有CUDA运行时API函数一样,如果没有安装适当版本的NVIDIA驱动程序,此函数将会正常失败并返回cudaErrorNoDevice到应用程序(如果没有支持CUDA的GPU或cudaErrorInsufficientDriver)。 如果cudaGetDeviceCount()报告错误,应用程序应该回退到另一个代码路径。
具有多个GPU的系统可能包含不同硬件版本和功能的GPU。 当使用来自同一应用程序的多个GPU时,建议使用相同类型的GPU,而不是混合硬件世代。 cudaChooseDevice()函数可用于选择最接近所需功能集的设备。
检测硬件和软件配置:
当应用程序依赖于某些硬件或软件功能的可用性来启用某些功能时,可以查询CUDA API以获取有关可用设备配置和已安装软件版本的详细信息。
错误处理:
所有CUDA运行时API调用都会返回类型为cudaError_t的错误代码; 如果没有发生错误,返回值将等于cudaSuccess。 (例外的是内核启动,它返回void和cudaGetErrorString(),它返回一个描述传入它的cudaError_t代码的字符串。)CUDA工具包库(cuBLAS,cuFFT等)同样返回它们自己的 错误代码集。
由于某些CUDA API调用和所有内核启动对于主机代码都是异步的,所以错误可能会异步报告给主机; 通常会在主机和设备下次进行同步时发生,例如在调用cudaMemcpy()或cudaDeviceSynchronize()期间。
始终检查所有CUDA API函数的错误返回值,即使对于预计不会失败的函数也是如此,因为这将允许应用程序在错误发生时尽快检测并从错误中恢复。 不检查CUDA API错误的应用程序有时可能会完成,而没有注意到GPU计算的数据不完整,无效或未初始化。
CUDA工具包示例提供了多个帮助函数,用于使用各种CUDA API进行错误检查; 这些辅助函数位于CUDA工具包的samples / common / inc / helper_cuda.h文件中。
建立最大的兼容性:
每代具有CUDA功能的设备都有相关的计算能力版本,用于指示设备支持的功能集(请参阅CUDA计算功能)。 一个或多个计算能力版本可以在构建文件时为nvcc编译器指定; 编译用于应用程序的目标GPU的本地计算能力对于确保应用程序内核实现最佳性能并且能够使用在给定代GPU上可用的功能是重要的。