2012-03-08 19 views
4

我成功使用cuda-memcheck獲取有關錯誤內存訪問的錯誤。編譯CUDA代碼-g -G給了很好的源位置是這樣的:cuda-memcheck,如何從地址獲取源代碼?

========= Error: process didn't terminate successfully 
========= Invalid __global__ read of size 1 
=========  at 0x00000710 in /some/path/somefile.cu:117:some_function 
=========  by thread (0,14,0) in block (1,16,0) 
=========  Address 0x00abac20 is out of bounds 

現在我試圖用-l開關也讓內存泄漏信息。然而,在這裏,我只獲得地址:

========= CUDA-MEMCHECK 
========= Leaked 3630 bytes at 0x007d2800 
========= 
========= Leaked 14740 bytes at 0x008e0700 
... 
========= 
========= LEAK SUMMARY: 11122140 bytes leaked in 39 allocations 
========= ERROR SUMMARY: 0 errors 
400 bytes at 0x005d2000 

我怎樣才能從這個實際的代碼位置?

回答

3

提供的泄漏地址不是代碼地址,而是數據位置。不幸的是,看到這些位置分配的位置並不容易。考慮到內存可以分配到任何地方(記住指針可以傳遞,別名等),檢查泄漏(即未分配的內存)的唯一方法是程序退出時。所以,當你的程序退出時,cuda-memcheck會檢查已分配但未被釋放的內存塊,併爲您提供內存塊的地址,但無法將其返回到分配時的位置。

相反,最簡單的方法是手動檢查您的代碼,以檢查所有cudaMalloc()調用的調用是否匹配cudaFree()。然而,這可能是一個相當費力的過程... ...

+0

VC++通過爲每個分配分配序列號來處理它,然後在出口處輸出該序列號以及泄漏摘要。通過使用相同的數據運行相同的代碼兩次,可以首先查找泄漏的分配的序列號,然後查找分配發生的位置。 – 2012-03-08 17:18:05

+1

爲了跟進我之前的評論,你可以爲cudaMalloc()創建一個包裝器,它增加一個靜態聲明的序列號,並將序列號和分配的內存地址寫入標準輸出或文件。程序結束後,查看cudaMalloc()包裝器打印的泄漏地址,以查找泄漏分配的序列號。然後修改cudaMalloc()包裝器,使其在序列號出現時中斷並重新運行程序。 – 2012-03-08 23:41:19