windows - x64 允许每个 block 的线程数少于 Win32?

标签 windows visual-studio cuda gpgpu

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

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

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

有人知道吗?

最佳答案

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

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

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

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

关于windows - x64 允许每个 block 的线程数少于 Win32?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35323687/

相关文章:

windows - Delphi Firemonkey Cross Platform - 传递 Windows 句柄的通用方法

windows - Windows 的 'Open with' 是如何工作的?

visual-studio - 如何使用 .NET Core 创建 Windows 窗体项目?

ubuntu - Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

android - Flutter Doctor --android-licenses : Exception in thread "main" java. lang.NoClassDefFoundError

c++ - 如何在 win32 上刷新 stdlib 输出文件?

visual-studio - 与 2008 年相比,Visual Studio 2010 的性能如何?

c# - 如何在 ngrok 上部署 visual studio 项目?

cuda - 我们如何在Hadoop上运行CUDA C程序?

c - 是否可以在 Windows 机器上为 Linux 编译 CUDA C 代码?