寄存器溢出是否可能导致CUDA_EXCEPTION_5,Warp超出范围地址错误?

时间:2012-12-03 19:12:43

标签: cuda

我收到了一个CUDA_EXCEPTION_5,Warp超出范围的地址错误,我正在试图找出导致这种情况的各种情况。

我正在努力将C项目(由其他人编写)移植到CUDA。 C代码非常重要,在堆栈中实例化了许多数组。我假设寄存器溢出很可能发生,并且可能触发了warp超出范围的错误。

请注意,我希望首先运行它,然后我将开始优化代码。

我正在使用Compute Capable 3.0硬件,根据维基百科有512KB的“每个线程的本地内存”。我在别处读到它每个SM有512KB的寄存器空间。每个正在运行的线程可以有512KB的寄存器空间吗?

我正在执行我的内核,如下所示(是的,我知道它超慢):

dim3 grid(28800,1);
cuPlotLRMap<<<grid,1>>>(...)

一些细节(我不知道这会有多大帮助):

我的硬件有7个SM。有112个运行块,这是否意味着每个块获得512k的寄存器空间的1/16?

我也理解一个线程是否超过了寄存器空间,它可以溢出到全局内存中。当发生这种情况时,并发线程是否有可能溢出到同一个全局内存空间?

1 个答案:

答案 0 :(得分:2)

  

每个线程512KB的“本地内存”。我在别处读过它有512KB的   每个SM注册空间。是否可以有512KB的寄存器空间   每个运行的线程?

请参阅“CUDA C编程指南”中的Compute Capabilities表。计算能力2.x及以上设备每个线程最多支持512KB的本地内存。函数cudaDeviceSetLimit(cudaLimitStackSize,bytesPerThread)可用于设置值。我相信默认值是每个线程2 KB。

  

我的硬件有7个SM。有112个运行块,这是否意味着每个块获得512k的寄存器空间的1/16?

计算能力3.x设备每个多处理器最多可以有16个驻留块。这假设您的寄存器/线程,线程/块或共享内存/块不会将内核限制为小于设备最大值。 Visual Profiler和Nsight VSE CUDA Profiler内核使用的配置。

目前,您只启动1个线程/块。你应该为每个块启动一个WARP_SIZE的倍数(32)。

  

我也理解一个线程是否超过了寄存器空间,它可以溢出到全局内存中。当发生这种情况时,并发线程是否有可能溢出到同一个全局内存空间?

在编译或JIT时,编译器将执行寄存器分配。如果每个线程没有足够的寄存器,则编译器将溢出到本地存储器。此操作是确定性的,不会在运行时确定。

计算能力3.0设备限制为63个寄存器/线程。计算能力3.5设备每个线程限制为255个寄存器。

相关问题