0

我在一个具有 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手术。有什么建议么?非常感谢!

4

2 回答 2

7

未指定的启动失败不是由于 cudaMemcpy 操作。这是紧接在该操作之前的内核启动的“遗留”错误。

内核启动失败可能是因为您正在使用cuda-memcheck.

您应该检查您的内核代码SetSubGridMarker是否对共享或本地内存进行了无效访问。

这些都不意味着您正在用完设备上的全局内存。

如果我在 C 中有一个这样的数组:

int C[5];

然后我尝试访问这样的元素:

int temp = C[6];  

那是越界访问。您正在访问超出定义的变量存储的末尾。这并不意味着您“内存不足”。

SetSubGridMarker您的代码中正在发生类似的事情。你需要找出那是什么并修复它。 cuda-memcheck通过告诉您块 (0,0,0) 中的线程 (0,0,0) 正在进行这种非法访问,还可以为您提供线索。通过仔细查看该线程如何索引存储在本地或共享内存中的数据,您应该能够发现错误。

您还可以使用此处描述的方法来cuda-memcheck识别生成故障的特定内核代码行。

于 2013-03-12T20:06:22.493 回答
2

这是一个超出范围的异常,而不是超出内存的异常。这意味着,您正在访问不属于任何有效(即静态或动态分配)内存范围的内存。最常见的原因是数组中的偏移量太大或为负数,或者指针未正确初始化。

正如消息所述,错误是在内部引起的grid::SetSubgridMarker()。但是由于内核调用是异步的,因此在下一次 CUDA 调用之前无法报告错误,这恰好是cudaMemcpy().

于 2013-03-12T20:06:12.947 回答