我正在尝试将 Google 的Address Sanitizer与 CUDA 项目一起使用,更准确地说是与 OpenCV cuda 功能一起使用。但是,我在第一次 cuda 调用时遇到了“内存不足”错误。
OpenCV Error: Gpu API call (out of memory) in getDevice, file opencv-2.4.11/src/opencv-2.4.11/modules/dynamicuda/include/opencv2/dynamicuda/dynamicuda.hpp, line 664
terminate called after throwing an instance of 'cv::Exception'
what(): opencv-2.4.11/src/opencv-2.4.11/modules/dynamicuda/include/opencv2/dynamicuda/dynamicuda.hpp:664: error: (-217) out of memory in function getDevice
它可以用
#include <opencv2/gpu/gpu.hpp>
int main()
{
cv::gpu::printCudaDeviceInfo(cv::gpu::getDevice());
return 0;
}
编译
clang++ -fsanitize=address -lstdc++ -lopencv_gpu -lopencv_core -o sanitizer sanitizer.cpp && LD_LIBRARY_PATH=/usr/local/lib ./sanitizer
我用 gcc 得到了同样的结果。我也尝试过将 cuda 函数列入黑名单,但没有结果。
现在使用没有opencv的cuda:
#include <cuda_runtime.h>
int main()
{
int count = -1;
cudaGetDevice(&count);
cout << "Device count: " << count << endl;
return 0;
}
clang++ -O1 -g -fsanitize=address -fsanitize-blacklist=asan.blacklist -stdlib=libstdc++ -lstdc++ -I/opt/cuda/include -L/opt/cuda/lib64 -lcudart -o sanitizer sanitizer.cpp && ./sanitizer
清理程序在内存泄漏时停止:
=================================================================
==25344==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 136 byte(s) in 1 object(s) allocated from:
#0 0x4bc4a2 (/home/pluc/work/tests/sanitizer+0x4bc4a2)
#1 0x7f71f0fa69ba (<unknown module>)
SUMMARY: AddressSanitizer: 136 byte(s) leaked in 1 allocation(s).
我的问题是如何使用地址清理程序来清理我的软件而不会陷入困境?我怎样才能至少正确地将所有与 cuda 相关的调用列入黑名单?
我在著名的网络搜索引擎上没有找到任何相关内容。就像人们不使用 cuda 或 asan 或两者兼而有之。伙计们只是有一个完全禁用 cuda 的构建吗?
我猜 asan 在 cuda 内存管理方面遇到了困难,但我正在寻找一种方法,至少在我的代码库的其余部分使用这个工具。