使用较高计算能力编译的CUDA代码会在计算能力较低的设备上完美执行很长时间,然后在某个核函数中默默地失败。我花了半天的时间追踪一个难以捉摸的错误,才意识到构建规则中使用了 sm_21
,而设备(Tesla C2050)是 2.0
。
是否有任何CUDA API代码可添加,以自检是否正在运行于具有兼容计算能力的设备上?我需要编译和处理多种计算能力的设备。是否还有其他操作可以采取,以确保不会发生此类错误?
使用较高计算能力编译的CUDA代码会在计算能力较低的设备上完美执行很长时间,然后在某个核函数中默默地失败。我花了半天的时间追踪一个难以捉摸的错误,才意识到构建规则中使用了 sm_21
,而设备(Tesla C2050)是 2.0
。
是否有任何CUDA API代码可添加,以自检是否正在运行于具有兼容计算能力的设备上?我需要编译和处理多种计算能力的设备。是否还有其他操作可以采取,以确保不会发生此类错误?
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对象中加载适当的设备代码,无需任何额外的主机代码。
运行设备查询。 查找系统中每个设备的计算能力。 然后使用SetDevice()在所需设备上执行代码。