具有较高计算能力的CUDA代码将在具有较低计算能力的设备上长时间完美运行,然后在某些内核中静默失败一天。我花了半天的时间追寻一个难以捉摸的错误,才意识到构建规则具有sm_21
,而设备(Tesla C2050)是2.0
。
我可以添加任何可以自动检查的CUDA API代码,如果它在具有兼容计算功能的设备上运行吗?我需要编译并使用具有许多计算功能的设备。我还有其他措施可以确保不会发生此类错误吗?
最佳答案
在运行时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
会生成带有嵌入的肥胖对象的输出对象文件,该对象包含GT200和GF100卡的cubin文件。运行时API将自动处理体系结构检测,并尝试从胖对象中加载合适的设备代码,而无需任何额外的主机代码。
关于cuda - CUDA:如何检查正确的计算能力?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6689129/