检测 OpenMP threads/CUDA 流之间的竞争条件

Detecting race conditions between OpenMP threads/CUDA streams

我从与 OpenMP 并行化的应用程序中得到错误的数值结果。每个 OpenMP 线程在 NVIDIA GPU 上运行一个或多个流。我怀疑在 更新 内存时 OpenMP 线程或 CUDA 流之间存在竞争条件。

我们如何找到访问相同主内存地址范围的 OpenMP threads/CUDA 流集?有什么工具吗?

在 CPU 上,您可以使用编译器的线程清理器。 GCC 和 Clang 通过选项 -fsanitize=thread 支持这一点。例如,您可以在 LLVM documentation. Note that these tools are quite new and are thus possibly a bit experimental. Alternatively, Helgrind of Valgrind can help you to find synchronization issues often causing race-conditions. If you are strongly tied to LLVM, you can try Archer. There are also several non-free tools for that (including Intel Inspector or Coderrect) mainly based on the last decade of active public research on the topic (see here 中找到更多信息。

在具有 CUDA 功能的 GPU 上,我知道的唯一 simple/ready-to-use 工具是 CUDA-MemCheck which is similar to what Valgrind provide on CPUs. It can be combined with CUDA-GDB 可以很容易地找到小 CUDA 代码中的错误。

最后,当您面临重现性问题(例如竞争条件)时,确定性反向调试器确实可以发挥作用。 RR 是一个很棒的开源工具。我不太确定它是否支持 application 运行ning CUDA 内核,但它确实值得一试。请注意,RR 倾向于 运行 线程顺序(尽管它们被抢占)影响结果行为。

完全披露:我为 Codrerect 工作。我在上面找到了每个信息丰富且有帮助的答案。只是想澄清一下,Coderrect Scanner 目前是免费的(完整功能的评估版),可从我们的网站获得。它确实包含处理仍在持续开发中的 CUDA 代码的简单功能,因此我鼓励您检查并尝试一下。让我们知道进展如何,我们欢迎任何反馈以不断改进我们的工具。