使用 Address Sanitizer 编译主机应用程序时可使用 OpenCL
OpenCL usable when compiling host application with Address Sanitizer
我正在调试 OpenCL 应用程序的崩溃。我试图使用 to asan 来确定问题的根源。但是后来我发现,在打开asan并重新编译后,我的应用程序找不到任何OpenCL设备。只需将 -fsanitize=address
添加到编译器选项,我的程序就无法使用 OpenCL。
通过进一步测试,我发现内存清理器不适用于 OpenCL。
为什么会这样?如何将 asan 与 OpenCL 结合使用?
编辑:一个最小的例子
#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
returns 通常 CL_SUCCESS。获取平台的过程没有报错
以及关于我的设置的一些信息。
显卡:GTX 780Ti
Driver: 418.56
OpenCL SDK: Nvidia OpenCL / POCL 1.3 with CPU and CUDA backend
编译器:GCC 8.2.1
OS:Arch Linux(内核 5.0.7 x64)
已知 NVIDIA 驱动程序与 ASAN 冲突。它试图将mmap(2)内存映射到进程内固定的虚拟内存范围内,这与ASAN的write-protected shadow gap region重合。鉴于 ASAN 在启动时保留了大约 20TB 的虚拟地址 space,因此与其他程序或驱动程序发生此类冲突的可能性也很大。
ASAN 识别某些 flags that may be set in the ASAN_OPTIONS
环境变量。要解决阴影间隙范围冲突,请将 protect_shadow_gap
选项设置为 0
。例如,假设一个 POSIX-like shell,你可能 运行 你的程序像
$ ASAN_OPTIONS=protect_shadow_gap=0 ./mandelbrot
由于未受保护的间隙 requires its own shadowing,可写影子间隙会在 ASAN 下产生额外的性能成本。这就是为什么不建议全局设置此选项的原因(例如,在您的 shell 启动脚本中)。仅为实际需要它的程序启用它。
我几乎可以肯定这是您问题的根本原因。我将 ASAN 与 CUDA 程序一起使用,并且始终需要设置此选项。没有它的 CUDA 报告的失败非常相似:cudaErrorNoDevice
error when I attempt to select a device.
我正在调试 OpenCL 应用程序的崩溃。我试图使用 to asan 来确定问题的根源。但是后来我发现,在打开asan并重新编译后,我的应用程序找不到任何OpenCL设备。只需将 -fsanitize=address
添加到编译器选项,我的程序就无法使用 OpenCL。
通过进一步测试,我发现内存清理器不适用于 OpenCL。
为什么会这样?如何将 asan 与 OpenCL 结合使用?
编辑:一个最小的例子
#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
returns 通常 CL_SUCCESS。获取平台的过程没有报错
以及关于我的设置的一些信息。
显卡:GTX 780Ti
Driver: 418.56
OpenCL SDK: Nvidia OpenCL / POCL 1.3 with CPU and CUDA backend
编译器:GCC 8.2.1
OS:Arch Linux(内核 5.0.7 x64)
已知 NVIDIA 驱动程序与 ASAN 冲突。它试图将mmap(2)内存映射到进程内固定的虚拟内存范围内,这与ASAN的write-protected shadow gap region重合。鉴于 ASAN 在启动时保留了大约 20TB 的虚拟地址 space,因此与其他程序或驱动程序发生此类冲突的可能性也很大。
ASAN 识别某些 flags that may be set in the ASAN_OPTIONS
环境变量。要解决阴影间隙范围冲突,请将 protect_shadow_gap
选项设置为 0
。例如,假设一个 POSIX-like shell,你可能 运行 你的程序像
$ ASAN_OPTIONS=protect_shadow_gap=0 ./mandelbrot
由于未受保护的间隙 requires its own shadowing,可写影子间隙会在 ASAN 下产生额外的性能成本。这就是为什么不建议全局设置此选项的原因(例如,在您的 shell 启动脚本中)。仅为实际需要它的程序启用它。
我几乎可以肯定这是您问题的根本原因。我将 ASAN 与 CUDA 程序一起使用,并且始终需要设置此选项。没有它的 CUDA 报告的失败非常相似:cudaErrorNoDevice
error when I attempt to select a device.