【问题标题】:Understanding Parallel Nsight OutOfRangeLoad Exception了解并行 Nsight OutOfRangeLoad 异常
【发布时间】:2012-07-15 05:07:09
【问题描述】:

我刚刚使用启用内存检查器选项运行 Nisght 2.2 并收到以下错误:

CUcontext blockIdx WarpIndex PC Active Mask Exception Exception Details

0x02af1c10 (0,0,0) 0 0x0001cc70 0x00000004 OutOfRangeLoad MemorySpace=Global Size=4

此外,输出如下:

GPU 状态:

地址 大小 类型 Mem Block Thread blockIdx threadIdx PC Source

05500e20 4 adr ld g 0 2 {0,0,0} {2,0,0} 000170 无可用来源

访问违规摘要:

Nsight 调试 内存检查器检测到 1 个访问冲突。 错误 = 加载访问冲突(全局内存) blockIdx = {0,0,0} threadIdx = {2,0,0} 地址 = 0x05500e20 访问大小 = 4

Nsight 调试

CUDA 内存检查器检测到 1 个线程导致访问冲突: 启动参数 CU上下文 = 026f1c10 CUstream = 03460f58 CU模块 = 047e7538 CUfunction = 047c26b0 函数名 = _Z19findHowManyBeforeWiPcPiS0_S0_S0_S_S0_S0_ii gridDim = {1,1,1} blockDim = {256,1,1} 共享大小 = 128 参数: 参数(原始): 0x05500400 0x05500800 0x05500c00 0x05500000 0x05501200 0x05500600 0x05500a00 0x05500e00 0x00000004 0x00000005 GPU 状态:

地址大小类型Mem Block Thread blockIdx threadIdx PC Source

05500e20 4 adr ld g 0 2 {0,0,0} {2,0,0} 000170 无可用来源

但是,我无法理解这些信息中的任何信息,除了线程 2 的函数 HowManyBeforeWi 中发生了错误。无论如何,是否可以找到发生错误的确切行,因为这看起来非常模糊。

【问题讨论】:

  • 尝试使用调试符号进行编译。 cuda-memcheck 在检测到越界访问时报告调试构建的行号。立即跳出来的一件事是报告的共享内存大小为 128,但该块有 256 个线程。您确定在全局内存加载期间越界共享内存访问不会导致问题吗?内核函数原型看起来是 findHowManyBeforeWi(char*, int*, int*, int*, int*, char*, int*, int*, int, int) 并且来自调试的指针参数看起来表面上是有效的,但如果没有重现案例,很难说更多。
  • @talonmies:如何在打开调试符号的情况下进行编译?当我使用 VS 2008 时,我已将 GPU 调试信息设置为 -G。我还有什么需要做的吗?
  • 对不起,我没有使用 Visual Studio 或 nsight。

标签: cuda gpu nvidia nsight


【解决方案1】:

调试器在引发访问冲突的行中断。或者,您可以使用“反汇编”窗格将问题发生的位置与程序计数器 (PC) 关联起来。

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多