【问题标题】:OpenCL usable when compiling host application with Address Sanitizer使用 Address Sanitizer 编译主机应用程序时可使用 OpenCL
【发布时间】:2019-09-09 01:36:18
【问题描述】:

我正在调试我的 OpenCL 应用程序的崩溃。我试图用 to asan 来确定问题的根源。但是后来我发现打开asan并重新编译后,我的应用程序找不到任何OpenCL设备。只需将-fsanitize=address 添加到编译器选项中,我的程序就无法使用 OpenCL。

经过进一步测试,我发现内存清理器不适用于 OpenCL。

为什么会这样?如何在 OpenCL 中使用 asan?

编辑:一个最小的例子

#include <CL/cl.hpp>
#include <vector>
#include <iostream>

int main() {
    std::vector<cl::Platform> platforms;
    cl::Platform::get(&platforms);
    if(platforms.size() == 0) std::cerr << "in asas\n";
    else std::cout << "compiled normally\n";
}

编辑 2:

cl::Platform::get 正常返回 CL_SUCCESS。获取平台过程中没有错误。

还有一些关于我的设置的信息。
显卡:GTX 780Ti
司机:418.56
OpenCL SDK:Nvidia OpenCL / POCL 1.3,带有 CPU 和 CUDA 后端
编译器:GCC 8.2.1
操作系统:Arch Linux(内核 5.0.7 x64)

【问题讨论】:

  • 您能提供MVCE吗? OpenCL API 的错误代码是什么?
  • 很抱歉给您带来不便。一旦将san 应用于应用程序,cl::Platform::Get() (使用C++ 包装器)什么也不返回。正常返回并抛出然后遇到错误。
  • 谢谢,error code 呢?这是哪个 OpenCL 实现?我建议将所有这些细节添加到问题中。
  • 抱歉没有再讲清楚。它正常返回。 IE 错误代码为 CL_SUCCESS。我将 NVIDIA 的 OpenCL 和 POCL 与 CUDA 后端一起使用。但我认为这是一个 ICD 加载器问题,它首先未能列出所有平台。
  • 这方面有什么新进展吗?在搜索 ASAN 和 OpenCl 时,这个问题是唯一的匹配项。在某个时候找到解决方案会很好......

标签: c++ debugging opencl address-sanitizer


【解决方案1】:

已知 NVIDIA 驱动程序与 ASAN 冲突。它尝试将内存 mmap(2) 到进程内的固定虚拟内存范围,这与 ASAN 的write-protected shadow gap region 一致。鉴于 ASAN 在启动时保留了大约 20TB 的虚拟地址空间,因此与其他程序或驱动程序发生此类冲突的可能性也不大。

ASAN 识别某些flags that may be set in the ASAN_OPTIONS 环境变量。要解决阴影间隙范围冲突,请将protect_shadow_gap 选项设置为0。例如,假设一个类似 POSIX 的 shell,你可以像这样运行你的程序

$ ASAN_OPTIONS=protect_shadow_gap=0 ./mandelbrot

可写影子间隙在 ASAN 下会产生额外的性能成本,因为未受保护的间隙 requires its own shadowing。这就是为什么不建议全局设置此选项的原因(例如,在您的 shell 启动脚本中)。仅对实际上需要它的程序启用它。

我几乎可以肯定这是您的问题的根本原因。我将 ASAN 与 CUDA 程序一起使用,并且始终需要设置此选项。没有它的CUDA报告的失败非常相似:cudaErrorNoDevice我尝试选择设备时出错。

【讨论】:

  • 非常感谢您提供详细背景的出色解释。这个真的,有帮助!!建议的解决方案在第一次尝试中看起来不错。我会仔细看看。
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 2023-04-06
  • 1970-01-01
  • 2021-12-02
  • 2019-06-06
  • 1970-01-01
  • 2014-02-08
  • 2020-07-01
相关资源
最近更新 更多