CUDA:如何检查正确的计算能力?

15

使用较高计算能力编译的CUDA代码会在计算能力较低的设备上完美执行很长时间,然后在某个核函数中默默地失败。我花了半天的时间追踪一个难以捉摸的错误,才意识到构建规则中使用了 sm_21,而设备(Tesla C2050)是 2.0

是否有任何CUDA API代码可添加,以自检是否正在运行于具有兼容计算能力的设备上?我需要编译和处理多种计算能力的设备。是否还有其他操作可以采取,以确保不会发生此类错误?

2个回答

18
在运行时API中,cudaGetDeviceProperties 返回两个字段majorminor,用于返回任何给定的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对象中加载适当的设备代码,无需任何额外的主机代码。


有任何想法为什么二进制文件能够检测到设备并加载适当的版本,但当存在单个不匹配的版本时却没有以有意义的错误退出? - Ashwin Nanjappa
1
基本上是过度抽象了。如果使用驱动程序API“手动”执行进程,如果没有适合目标GPU的cubin,则会返回有意义的错误消息。但是许多步骤都隐含地发生(设备选择、上下文建立、模块加载、代码和数据检索),如果其中任何一个被故意抽象的过程失败,则运行时将返回通用初始化错误。如果您需要那种程度的控制,请使用驱动程序API显式管理上下文,然后在运行时API中使用该上下文。自CUDA 3.1以来支持互操作性。 - talonmies
1
@Ashwin:在发布回答两年半后才接受它,这一定是某种记录…… - talonmies
1
哈哈。我想我忘记接受了。今天又遇到了,然后做了正确的事情 :-D - Ashwin Nanjappa
nvcc致命错误:不支持的GPU架构“sm_13source.cu” 还有其他通用命令吗? - Mona Jalal

0

运行设备查询。 查找系统中每个设备的计算能力。 然后使用SetDevice()在所需设备上执行代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接