x64允许每个块的线程少于Win32?

时间:2016-02-10 19:00:12

标签: windows visual-studio cuda gpgpu

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

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

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

任何人都有任何想法?

1 个答案:

答案 0 :(得分:4)

是的,这是可能的。据推测,你所谈论的问题是registers-per-thread issue

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

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

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