【问题标题】:x64 allows less threads per block than Win32?x64 每块允许的线程数比 Win32 少?
【发布时间】:2016-05-21 07:20:12
【问题描述】:

当我执行一些 cuda 内核时,我注意到对于我自己的许多 cuda 内核,x64 构建会导致失败,而 Win32 不会。

我很困惑,因为 cuda 源代码是相同的,并且构建很好。就在 x64 执行时,它说它需要太多资源来启动。但是从概念上讲,x64 不应该比 Win32 允许更多的资源吗?

如果可能的话,我通常喜欢每个块使用 1024 个线程。因此,要使 x64 代码工作,我必须将块缩小到 256。

有人知道吗?

【问题讨论】:

    标签: windows visual-studio cuda gpgpu


    【解决方案1】:

    是的,这是可能的。大概您正在谈论的问题是registers-per-thread issue

    在 32 位模式下,所有指针都是 32 位的,并且只需要一个 32 位寄存器来存储在 GPU 上。使用完全相同的源代码,这些指针将需要 64 位存储,因此实际上需要两个 32 位寄存器(并且,正如@njuffa 在下面指出的那样,某些其他类型也可以改变它们的大小,需要双倍的寄存器.) 可用 32 位寄存器的数量是硬件限制,无论编译为 32 位还是 64 位模式都不会改变,但指针存储将使用 64 位模式下两倍的寄存器。

    指针算术(或涉及任何增加大小的类型的算术)同样可能会受到影响,因为其中一些可能需要使用 64 位算术与 32 位算术来完成。

    如果这些寄存器在 64 位模式下的增加使您的整体使用量超过了限制,那么您将不得不使用多种方法中的一种来管理它。您已经提到过一个:减少线程数。您还可以调查nvcc -maxrregcount ... switch 和/或launch bounds directive

    【讨论】:

    • 除了指针,其他类型也可能会增加大小。例如,size_tptrdiff_t 在 Win32 上是 32 位类型,但在 Win64 平台上是 64 位类型。在 Linux 平台上,long 类型在从 32 位平台切换到 64 位平台时同样会从 32 位变为 64 位。
    • 非常感谢你们!
    • 我也想知道,每个块的 less-threads-per-block 应该执行得更慢吗?我是这么认为的,这就是为什么我总是更喜欢 1024 个线程/块。谢谢。
    • 这是一个相当复杂的问题,受许多因素的影响,例如入住率。通常,每个块 1024 个线程可能并不总是最佳选择。每个块 256 或 512 个线程这样的数字是最佳选择并不少见,但在大多数情况下,这只会导致性能上的微小差异。
    • @RobertCrovella 我明白了。非常感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2023-02-11
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多