【问题标题】:openACC compiled code, cuStreamSynchronize returned error 700openACC编译代码,cuStreamSynchronize返回错误700
【发布时间】:2019-11-24 19:43:04
【问题描述】:

我已经用简单的 openACC 衍生物编译了一个程序。编译很好,没有错误。但是,当我运行程序时,出现了一个通用的“调用 cuStreamSynchronize 返回错误 700:内核执行期间的非法地址”错误。

我运行了 cuda-memcheck 并得到以下错误。有没有人可以帮我找出问题?

========= CUDA-MEMCHECK
simpleGridingRatio: 300
========= Invalid __global__ read of size 4
=========     at 0x000007a8 in /home/forwardSolver/ChannelCppSolver.h:135:void linearDiscretization_135_gpu<double>(caseProp<double>&, std::vector<double, std::allocator<double>>&, std::vector<double, std::allocator<double>>&, std::vector<double, std::allocator<double>>&, std::vector<double, std::allocator<double>>&)
=========     by thread (0,0,0) in block (0,0,0)
=========     Address 0x7ffca4f9a7b0 is out of bounds
=========     Saved host backtrace up to driver entry point at kernel launch time
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so (cuLaunchKernel + 0x2fe) [0x28187e]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch3 + 0x1d59) [0x1a64a]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so [0x1b392]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch + 0x13a) [0x1b4ce]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccg.so (__pgi_uacc_launch + 0x1ff) [0x18f92]
=========     Host Frame:./ChannelCppProposal [0x2ffd5]
=========     Host Frame:./ChannelCppProposal [0x2dfe4]
=========     Host Frame:./ChannelCppProposal [0x2dd77]
=========     Host Frame:./ChannelCppProposal [0x2fcc5]
=========     Host Frame:./ChannelCppProposal [0x2eaf7]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xe7) [0x21b97]
=========     Host Frame:./ChannelCppProposal [0x65fa]
=========
========= Program hit CUDA_ERROR_LAUNCH_FAILED (error 719) due to "unspecified launch failure" on CUDA API call to cuStreamSynchronize. 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so (cuStreamSynchronize + 0x165) [0x281355]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch3 + 0x20c9) [0x1a9ba]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so [0x1b392]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch + 0x13a) [0x1b4ce]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccg.so (__pgi_uacc_launch + 0x1ff) [0x18f92]
=========     Host Frame:./ChannelCppProposal [0x2ffd5]
=========     Host Frame:./ChannelCppProposal [0x2dfe4]
=========     Host Frame:./ChannelCppProposal [0x2dd77]
=========     Host Frame:./ChannelCppProposal [0x2fcc5]
=========     Host Frame:./ChannelCppProposal [0x2eaf7]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xe7) [0x21b97]
=========     Host Frame:./ChannelCppProposal [0x65fa]
=========
Failing in Thread:1
========= Program hit CUDA_ERROR_LAUNCH_FAILED (error 719) due to "unspecified launch failure" on CUDA API call to cuCtxSynchronize. 
=========     Saved host backtrace up to driver entry point at error
call to cuStreamSynchronize returned error 719: Launch failed (often invalid pointer dereference)

=========     Host Frame:/usr/lib/x86_64-linux-gnu/libcuda.so (cuCtxSynchronize + 0x152) [0x258c22]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_error_handler + 0x258) [0xef30]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch3 + 0x20ec) [0x1a9dd]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so [0x1b392]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccn.so (__pgi_uacc_cuda_launch + 0x13a) [0x1b4ce]
=========     Host Frame:/opt/pgi/linux86-64-llvm/19.4/lib/libaccg.so (__pgi_uacc_launch + 0x1ff) [0x18f92]
=========     Host Frame:./ChannelCppProposal [0x2ffd5]
=========     Host Frame:./ChannelCppProposal [0x2dfe4]
=========     Host Frame:./ChannelCppProposal [0x2dd77]
=========     Host Frame:./ChannelCppProposal [0x2fcc5]
=========     Host Frame:./ChannelCppProposal [0x2eaf7]
=========     Host Frame:/lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main + 0xe7) [0x21b97]
=========     Host Frame:./ChannelCppProposal [0x65fa]
=========
========= ERROR SUMMARY: 3 errors

【问题讨论】:

    标签: openacc


    【解决方案1】:

    “内核执行期间的非法地址”类似于使用错误地址的主机上的分段违规 (segv)。

    虽然我不能确定,但​​“地址 0x7ffca4f9a7b0”在我看来是一个主机地址。

    同样来自 linearDiscretization_135_gpu 的签名,看起来您在代码中使用了向量。您如何管理这些向量的数据?向量是具有三个指针的不透明类。鉴于 OpenACC 数据区域执行浅拷贝,如果在数据子句中包含向量,则只会复制指针,而不是它们指向的数据。因此,如果我的主机地址是正确的,一个可能的原因是您正在复制一个向量,该向量复制了主机指针地址,这会导致设备上出现非法地址错误。

    对于向量,您需要执行手动深度复制,或者如果您使用 PGI,请尝试使用“-ta=tesla:managed”进行编译,以便使用 CUDA 统一内存。使用的 Vector 指针将成为主机和设备均可访问的统一地址。

    当然,这纯粹是猜测工作,因此您可能需要进行更多调查。您可以尝试设置环境变量 PGI_ACC_DEBUG=1(对于 PGI)或 CRAY_ACC_DEBUG=1(对于 Cray)以让运行时打印详细信息。不确定 GNU 是否有与其 OpenACC 实现等效的环境变量。

    如果您需要更多帮助调查,请提供一个小的复制示例,我们可以看看我们是否可以确定问题所在。

    【讨论】:

    • 嗨,垫子。感谢您的回复。是的,我在自定义结构 caseProp 中使用向量。我有点将所有数据向量保存在结构中。我想我一开始就犯了错误,没有考虑openACC。在看到很多人说矢量对于 openACC 来说是一个不好的选择之后,我不太确定该怎么做。我读了一些关于深拷贝和统一内存的内容。但是, -ta=tesla:managed 并没有消除这个问题。我仍在阅读有关深拷贝的更多内容,不确定统一内存是否不起作用深拷贝是否会有所帮助。
    • 向量可以在 OpenACC 中使用,但并不理想。除了不是线程安全的(对于并行算法来说,它们通常是一个糟糕的选择),它们在主机和设备内存之间管理起来可能很棘手。如果您使用 PGI,请尝试使用“-ta=tesla:managed”进行编译,看看使用 CUDA 统一内存是否有帮助。
    • 不过,你真的需要使用 Vectors 吗?通常人们只是出于习惯使用向量,并且可以很容易地用简单的数组替换。
    • 您可能会感兴趣的一件事是使用 C++17 并行 STL。虽然我们 (PGI) 仍在努力实现可以卸载到设备的 pSTL,但您可以通过查看 David Olsen 在 GTC2019 上的演示来预览我们正在做的事情:on-demand.gputechconf.com/gtc/2019/video/_/S9770/…
    猜你喜欢
    • 2016-04-10
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多