【发布时间】: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