【问题标题】:Debugging an "Invalid address space" error调试“无效地址空间”错误
【发布时间】:2017-09-24 05:07:23
【问题描述】:

我构建了一些使用 OpenACC 的 C++ 代码,并使用 PGI 编译器对其进行编译,以便在 Tesla GPU 上使用。

编译成功,没有任何警告。

我运行程序并得到两个错误:

call to cuStreamSynchronize returned error 717: Invalid address space
call to cuMemFreeHost returned error 717: Invalid address space

互联网似乎对此知之甚少,除了建议enabling unified memory 以便自动将问题扫到地毯下。我不喜欢那种解决方案。

我该如何调试这个?

由于 C++ 代码仅在 CPU 上运行,我会启动 gdb,进行回溯,然后说:“啊哈!”

但现在我的代码存在于 CPU 和 GPU 上,数据在两者之间流动。我什至不知道该使用什么工具。

回退是开始注释行直到问题消失,但这似乎也不是最理想的。

【问题讨论】:

    标签: c++ debugging openacc


    【解决方案1】:

    您可以使用“cuda-gdb”调试设备代码或使用“cuda-memcheck”检查内存错误。

    虽然我不确定这两者是否会有所帮助。该错误表明设备代码正在使用来自错误内存空间的地址发出指令。例如,将共享内存指针与需要全局内存指针的指令一起使用。

    我以前没有见过这个错误,也没有看到任何以前的错误报告,所以只能推测原因。一种可能性是,如果您有一个共享内存变量(“私有”子句或“缓存”指令中的标量或数组),它从外部 gang 循环传递到向量例程。在这种情况下,向量例程可能会像访问全局内存一样访问变量。

    不管是什么原因,很可能是编译器错误。如果可能,请发布或发送给 PGI 客户服务 (trs@pgroup.com) 一个复制示例,我将把它交给我们的编译器工程师进行调查。

    一旦我更好地了解原因,我也可以尝试为您解决问题。虽然在此期间您可以尝试使用“-ta=tesla:nollvm,keepgpu”进行编译。 “nollvm”将导致编译器生成 OpenACC 内核的中间 CUDA C 版本,而不是默认的 LLVM 设备代码生成器。 “keepgpu”将保留您可以检查的中间“.gpu”文件。

    【讨论】:

    • 谢谢,马特!我可能需要几天的时间才能对此进行测试,但我已经向您建议的地址发送了一封电子邮件,其中包含有问题的代码(代码足够短,可以作为可重现的示例)。
    • 问题是您在原子中使用了一个局部变量。原子仅允许与共享或全局内存一起使用。我已向您发送了更新的源文件,其中包含解决此问题并提高代码性能的建议更改。
    【解决方案2】:

    有一些有助于调试的有用环境变量。可以启用任意组合:

    export PGI_ACC_TIME=1   #Profile time usage
    export PGI_ACC_NOTIFY=1 #Set to values 0-3 where 3 is the most detailed
    export PGI_ACC_DEBUG=1  #Extra debugging info
    

    【讨论】:

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