13

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関連のすべての呼び出しを適切にブラックリストに登録するにはどうすればよいですか?

有名な Web 検索エンジンで関連するものは見つかりませんでした。人々が cuda や asan、あるいはその両方を使用していないようです。cuda を完全に無効にしたビルドを持っているだけですか?

asan は cuda メモリ管理に苦労していると思いますが、少なくともコードベースの残りの部分でこのツールを使用する方法を探しています。

4

1 に答える 1