【问题标题】:CUDA: How to check for the right compute capability?CUDA:如何检查正确的计算能力?
【发布时间】:2011-07-14 06:12:35
【问题描述】:

使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长时间,然后有一天会在某些内核中静默失败。我花了半天时间寻找一个难以捉摸的错误,结果发现构建规则有sm_21,而设备(Tesla C2050)是2.0

我是否可以添加任何 CUDA API 代码,它可以自我检查它是否在具有兼容计算能力的设备上运行?我需要编译和使用具有多种计算能力的设备。我可以采取任何其他措施来确保不会发生此类错误吗?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    在运行时 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 对象加载合适的设备代码,而无需任何额外的主机代码。

    【讨论】:

    • 知道为什么二进制文件可以检测到设备并加载合适的版本,但在存在单个版本(不匹配)时不会以有意义的错误退出?
    • 抽象太多了,基本上。如果您使用驱动程序 API “手动”执行该过程,则如果目标 GPU 没有合适的立方体,则会返回一条有意义的错误消息。但是很多步骤都是隐式发生的(设备选择、上下文建立、模块加载、代码和数据检索),如果这些故意抽象的过程中的任何一个失败,运行时就会返回一个通用的初始化错误。如果您需要这种程度的控制,请使用驱动程序 API 自己显式管理上下文,然后在运行时 API 中使用上下文。自 CUDA 3.1 起支持互操作性
    • @Ashwin:在发布两年半后接受了答案。那一定是某种记录.....
    • 哈哈。我猜忘记接受了。今天再次遇到它并做了正确的事情:-D
    • nvcc fatal : Unsupported gpu architecture 'sm_13source.cu' 还有更通用的命令吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 2013-05-03
      • 1970-01-01
      相关资源
      最近更新 更多