【问题标题】:How to make a atomic device function in cuda?如何在 cuda 中制作原子设备功能?
【发布时间】:2014-11-10 23:32:53
【问题描述】:

我的内核将结果写入一些全局设备变量。 所以,我需要把函数写成原子函数。 可能吗? 如果不是,我正在尝试对每个全局变量使用 atomicExch() 。 但其中一些是 struct 或 float 而不是 int。 据我所知,原子操作是针对 int 的。 我该如何处理这个问题。 谢谢。

【问题讨论】:

  • 你读过编程指南的relevant section吗?一些原子操作可以对float 数量进行操作。确切的原子支持将取决于您正在编译的 GPU 类型(什么计算能力)。原子不能用于整个结构,只能用于 POD 类型。您的问题是关于如何以原子方式更新多个变量(即一次全部更新)?
  • 谢谢,罗伯特。我的 GPU 是 geforce gtx 750,计算能力是 5.0。并且。结构是 POD。我发现float有一个atomicExch,但正如你所说,我如何申请POD struct?我的第一个问题是,它可以将用户定义的函数作为原子函数或几个指令的关键部分,因为我定义了将结果分配给全局设备变量的函数。
  • “原子地”更新整个结构,可能使用critical section code 是一种可能性。 This question 也可能感兴趣。
  • 非常感谢,它非常适合比赛条件。我可以再问一个问题吗?我的内核因 cudaErrorLaunchOutofResources 而失败。我认为这与每个块过度使用寄存器有关。但是 ptxas 告诉内核只使用 28 个寄存器。该内核以 32*32 = 1024 个线程启动,因此每个块使用的寄存器数量为 1024*28 = 28672
  • 1> ptxas info : 为 'sm_50' 编译入口函数 '_Z9ARM_MatchPjPxiif' 1> ptxas info : _Z9ARM_MatchPjPxiif 的函数属性 1> 224 字节堆栈帧,0 字节溢出存储,0 字节溢出加载 1> ptxas info : 使用了 28 个寄存器,348 字节 cmem[0]

标签: cuda parallel-processing atomic


【解决方案1】:

我知道了引发 cudaErrorLaunchOutOfResources 错误的原因。 我的内核使用了 28 个寄存器,但是项目设置没有覆盖它。 CUDA C/C++ ->Device->Max Used Register设置为0,改成30后,错误消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2015-02-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多