【问题标题】:Why would using less than max threads make my kernel run faster?为什么使用少于最大线程数会使我的内核运行得更快?
【发布时间】:2012-10-17 21:24:53
【问题描述】:

我编写了一个简单的 CUDA 内核来对两个大小为 2^18 的列向量执行 SAXPY。

我发现我的 GPU 是 Tesla C2070,每个块最多可以运行 1024 个线程。因此,我使我的块大小 X = 1024,Y = 1,Z = 1。我还使我的网格大小 X = 2^18 / 1024,Y = 1,Z = 1。我这样做是因为我想确保每个块的每个线程都在使用。

但是,我发现以 X = 512 和 X = 128 的块大小运行内核始终比以 X = 1024 的块大小运行内核的速度更快。

这是为什么呢?如果我的块大小小于 1024,我不是在浪费线程吗?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    像 SAXPY 这样的 1 级 BLAS 函数受内存带宽限制。操作

    y <- alpha * x + y
    

    只执行一次 FMAD,但需要两次加载和一次全局内存中的存储。您的 C2070 具有大约 37.5Gfloat/s 的全局内存带宽和 500 GFMAD/s 的单精度算术吞吐量。所以性能是由内存控制器而不是 ALU 决定的。通常减少内存带宽受限内核中每个块的线程数会提高性能,因为它减少了内存控制器和缓存资源的争用,并增加了带宽利用率。

    这可能是您的 SAXPY 内核发生的情况。您应该能够通过基准测试找到最佳块大小,但我的经验是,在像您的 C2070 这样的 Fermi 设备上,每个块将有 128-384 个线程。

    【讨论】:

      【解决方案2】:

      对于使用共享内存来缓存读取/写入/数据共享的代码,更小的块大小可能会导致每个线程使用更大的共享内存块,这反过来会增加良好内存访问模式的机会(更多合并)。

      我同意 talonmies 的观点,根据我的经验,每个块 128-192 个线程几乎总是可以为我的代码带来最佳性能,即使可以启动更多线程。

      【讨论】:

        猜你喜欢
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        • 2023-03-15
        • 2022-09-24
        • 2013-04-14
        • 2019-12-01
        • 1970-01-01
        相关资源
        最近更新 更多