我收到了一个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?
我也理解一个线程是否超过了寄存器空间,它可以溢出到全局内存中。当发生这种情况时,并发线程是否有可能溢出到同一个全局内存空间?
答案 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个寄存器。