CUDA 运行时错误:未指定的启动失败 & 超出范围的共享或本地地址
CUDA runtime error: unspecified launch failure & Out-of-range Shared or Local Address
我在一个具有1GB全局内存的GPU上运行这个程序。它给出了以下错误:
Fatal error: cudaMemcpy1 error (unspecified launch failure at CheckDevice.cu:27)
*** FAILED - ABORTING
========= Out-of-range Shared or Local Address
========= at 0x000006a8 in grid::SetSubgridMarker(grid*, grid*)
========= by thread (0,0,0) in block (0,0,0)
========= Device Frame:SetAllFlags_dev(param_t*, grid*) (SetAllFlags_dev(param_t*, grid*) : 0x108)
========= Device Frame:SetAllFlags(param_t*, grid*) (SetAllFlags(param_t*, grid*) : 0x38)
========= Saved host backtrace up to driver entry point at kernel launch time
========= Host Frame:/usr/lib/libcuda.so (cuLaunchKernel + 0x3dc) [0xc9edc]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 [0xa18a]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaLaunch + 0x17f) [0x2f4cf]
========= Host Frame:Transport [0xd395]
========= Host Frame:Transport [0xd7bd]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
========= Host Frame:Transport [0x17bd]
=========
========= Program hit error 4 on CUDA API call to cudaMemcpy
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib/libcuda.so [0x26a180]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaMemcpy + 0x271) [0x348e1]
========= Host Frame:Transport [0x2cea]
========= Host Frame:Transport [0x3769]
========= Host Frame:Transport [0xd7ee]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
========= Host Frame:Transport [0x17bd]
=========
========= Program hit error 4 on CUDA API call to cudaGetLastError
========= Saved host backtrace up to driver entry point at error
========= Host Frame:/usr/lib/libcuda.so [0x26a180]
========= Host Frame:/usr/local/cuda/lib64/libcudart.so.5.0 (cudaGetLastError + 0x1e6) [0x2a046]
========= Host Frame:Transport [0x2cef]
========= Host Frame:Transport [0x3769]
========= Host Frame:Transport [0xd7ee]
========= Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xed) [0x2176d]
========= Host Frame:Transport [0x17bd]
=========
========= ERROR SUMMARY: 3 errors
对于未指定的启动失败错误,相关代码行是cudaMemcpy操作:
cudaMemcpy(CurrentGrid, Grid_dev, sizeof(grid), cudaMemcpyDeviceToHost);
cudaCheckErrors("cudaMemcpy1 error");
则如错误信息所示,显示为Out-of-range Shared or Local Address at 0x000006a8 in grid::SetSubgridMarker(grid*, grid*)
。是因为设备上的全局内存耗尽吗?是否有一种方法可以返回设备上的内存使用情况?
在源代码中,checkDevice。cu在grid::SetSubgridMarker和checkDevice之后执行,不会消耗设备上的太多内存空间,所以我猜测(但没有太多信心)是grid::SetSubgridMarker
耗尽了内存,因此没有空间启动cudaMemcpy操作。有什么建议吗?非常感谢!
未指定的启动失败不是由于cudaMemcpy操作。这是内核启动时在该操作之前出现的"剩余"错误。
内核启动失败可能是因为内存越界访问被报告,因为你正在运行你的代码与cuda-memcheck
。
您应该检查SetSubGridMarker
中的内核代码是否存在对共享或本地内存的无效访问。
这些都不意味着设备的全局内存已经用完。
如果我有一个像这样的C数组:
int C[5];
然后我尝试像这样访问一个元素:
int temp = C[6];
这是一个越界访问。您正在访问超出您定义的变量存储的末端。这并不意味着你"内存不足"。
在你的SetSubGridMarker
代码中发生了类似的事情。你得找出问题所在,然后解决它。cuda-memcheck
也给了你一个线索,告诉你块(0,0,0)中的线程(0,0,0)正在进行非法访问。通过仔细查看这个线程如何索引存储在本地或共享内存中的数据,您应该能够发现错误。
您还可以使用这里描述的方法,让cuda-memcheck
识别生成错误的内核代码的特定行。
这是一个超出范围异常,而不是超出内存异常。这意味着,您正在访问的内存不是任何有效(即静态或动态分配)内存范围的一部分。最常见的原因是数组中的偏移量太大或为负,或者指针没有正确初始化。
如消息所述,错误是在grid::SetSubgridMarker()
内部引起的。然而,由于内核调用是异步的,在下一个CUDA调用之前不能报告错误,这恰好是cudaMemcpy()
。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 正在将指针转换为范围
- 在cuda线程之间共享大量常量数据
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在基于范围的for循环中使用结构化绑定声明
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 我是否误解了此默认参数共享的范围
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 范围之后,在Lambda中设置的共享指针
- C ++"在使用MySQL C API生成的共享库时未在此范围错误中声明
- 将gcov与子进程和共享库一起使用时没有覆盖范围
- 在使用共享库时,c++ [class]没有在此范围内声明
- 在范围结束后提升共享指针"runtime error"
- CUDA 运行时错误:未指定的启动失败 & 超出范围的共享或本地地址