使用更高计算能力编译的CUDA代码将在具有较低计算能力的设备上长时间完美执行,然后在某些内核中静默失败一天。我花了半天时间追逐一个难以捉摸的bug只是为了意识到构建规则sm_21
而设备(Tesla C2050)是2.0
。
我是否可以添加任何可以自行检查的CUDA API代码是否在具有兼容计算功能的设备上运行?我需要编译和使用许多计算能力的设备。我可以采取任何其他措施来确保不会发生此类错误吗?
答案 0 :(得分:17)
在运行时API中,cudaGetDeviceProperties返回两个字段major
和minor
,它们返回任何给定枚举的CUDA设备的计算能力。您可以使用它来解析任何GPU的计算能力,然后在其上建立上下文,以确保它是您的代码所做的正确架构。 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对象加载合适的设备代码,而无需任何额外的主机代码。
答案 1 :(得分:0)
运行设备查询。 查找系统中每个设备的计算能力。 然后使用SetDevice();
在所需设备上执行代码