编译具有更高计算能力的CUDA代码将在具有较低计算能力的设备上长时间完美地执行,然后在某些内核中静默失败一天 . 我花了半天时间追逐一个难以捉摸的小虫只是为了意识到构建规则有 sm_21 而设备(特斯拉C2050)是 2.0 .
sm_21
2.0
是否有我可以添加的CUDA API代码可以自我检查它是否在兼容计算能力的设备上运行?我需要编译和使用许多计算能力的设备 . 我可以采取任何其他措施来确保不会发生此类错误吗?
在运行时API中,cudaGetDeviceProperties返回两个字段 major 和 minor ,它们返回任何给定枚举的CUDA设备的计算能力 . 您可以使用它来解析任何GPU的计算能力,然后在其上 Build 上下文,以确保它是您的代码所做的正确架构 . nvcc 可以使用 -gencode 选项从单个调用生成包含多个体系结构的目标文件,例如:
major
minor
nvcc
-gencode
nvcc -c -gencode arch=compute_20,code=sm_20 \ -gencode arch=compute_13,code=sm_13 \ source.cu
将生成一个输出对象文件,其中包含嵌入的fatbinary对象,其中包含GT200和GF100卡的cubin文件 . 运行时API将自动处理体系结构检测,并尝试从fatbinary对象加载合适的设备代码,而无需任何额外的主机代码 .
运行设备查询 . 查找系统中每个设备的计算能力 . 然后使用SetDevice()在所需设备上执行代码;
2 回答
在运行时API中,cudaGetDeviceProperties返回两个字段
major
和minor
,它们返回任何给定枚举的CUDA设备的计算能力 . 您可以使用它来解析任何GPU的计算能力,然后在其上 Build 上下文,以确保它是您的代码所做的正确架构 .nvcc
可以使用-gencode
选项从单个调用生成包含多个体系结构的目标文件,例如:将生成一个输出对象文件,其中包含嵌入的fatbinary对象,其中包含GT200和GF100卡的cubin文件 . 运行时API将自动处理体系结构检测,并尝试从fatbinary对象加载合适的设备代码,而无需任何额外的主机代码 .
运行设备查询 . 查找系统中每个设备的计算能力 . 然后使用SetDevice()在所需设备上执行代码;