代码之家  ›  专栏  ›  技术社区  ›  Richard

调试“无效地址空间”错误

  •  1
  • Richard  · 技术社区  · 7 年前

    我已经构建了一些使用OpenACC的C++代码,并使用PGI编译器进行编译,以在特斯拉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和数据在两者之间流动。我甚至不知道该用什么工具。

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Mat Colgrove    7 年前

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

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

    一旦我更好地了解原因,我也可以试着给你找份工作。尽管在此期间,您可以尝试使用“-ta=tesla:nollvm,keepgpu”进行编译。“nollvm”将使编译器生成OpenACC内核的中间CUDA C版本,而不是默认的LLVM设备代码生成器。“keepgpu”将保留中间文件“.gpu”,您可以查看该文件。

        2
  •  0
  •   Richard    7 年前

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

    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