【问题标题】:CUDA performance with respect to threads per block关于每个块的线程的 CUDA 性能
【发布时间】:2012-07-19 23:01:21
【问题描述】:

为了兴趣,我正在尝试使用 CUDA。在其中一个实验中,我有一个小内核,它只在 for 循环中运行了 1000 万次。我发送 1 个块,然后将每个块的线程数从 1 增加到 1024。然后我绘制了执行以查看它是如何变化的。结果是在每块大约 350 个线程处急剧上升,然后在逐渐的时刻急剧上升。执行时间变为每块 1024 个线程时的 2 倍,这表明至少有一个线程已被阻塞。实际的图表就像一个递增的阶梯。我想了解的是这些上升的原因和数量取决于。我试图了解它的 SM、cuda 核心数量等。

我正在使用 GeForce 560 Ti,配备 8 个 SM,每个 SM 48 个内核和每个 SM 2 个 warp 调度程序。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    每个块 350 个线程急剧增加的一个可能原因是该块消耗了太多资源,以至于 SM 一次不能处理多个块。您可以使用 CUDA 占用计算器根据内核的资源使用情况查看一个 SM 一次将处理多少块。

    【讨论】:

    • 我还打算用指向 CUDA 占用计算器的指针来回答这个问题。它将显示您看到的那些“楼梯”类型的图表。它还显示了决定给定内核占用率的所有因素,并让您可以玩弄这些数字以了解一切如何相互作用。
    • 但是我想知道一件事——因为我有 8 个 SM 和 48 核 ch,那么这意味着我可以同时运行 8x48 个线程,那么每个 SM 有 1536 个活动线程意味着什么。我希望,如果我每个块有 23 个线程并且我增加块,那么我应该在 16 个块处获得跳跃,因为每个块使用 23 个内核,因此 2 个块可以进入 1 个 SM,因此总共有 16 个并发块。我发现在 16 处没有跳跃,但在 64 处,这是最大并发块的限制
    • 归结为定义。 “运行”和“活跃”是什么意思? CC 2.0 设备中的 32 个内核意味着您每个时钟具有 32 个单精度浮点/整数/逻辑运算的潜在吞吐量。 16 个加载/存储单元和 4 个特殊功能单元类似。但是内核是流水线的,所以有很长的延迟。所以在每个时钟,一组线程将它们的计算添加到管道中,一组线程接收它们的结果,并且许多线程处于暂停状态,等待它们的结果通过。
    猜你喜欢
    • 2023-03-20
    • 2020-10-15
    • 1970-01-01
    • 2011-05-22
    • 2018-07-31
    • 2012-09-09
    • 2015-02-12
    • 2015-12-27
    相关资源
    最近更新 更多