cuda-memcheck, как добраться от адреса до исходного кода? - PullRequest
4 голосов
/ 08 марта 2012

Я успешно использовал cuda-memcheck для получения ошибок о неправильном доступе к памяти.Компиляция кода cuda с помощью -g -G дала хорошие исходные местоположения, подобные этому:

========= 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

Как я могу получить фактические местоположения кода из этого?

1 Ответ

3 голосов
/ 08 марта 2012

Адреса, предоставленные для утечки, являются не адресами кода, а местоположениями данных.К сожалению, нелегко увидеть, где были расположены эти местоположения.

Учитывая, что память могла быть выделена где угодно (помните, что указатели могут быть переданы, псевдонимы и т. Д.) Единственный способ проверить на утечки (т.е.выделенная память, которая не освобождается) - это когда программа выходит.Поэтому, когда ваша программа завершает работу, cuda-memcheck проверяет фрагменты памяти, которые были выделены, но не освобождены, и дает вам адрес фрагмента памяти, но не имеет возможности связать его с тем, когда он был выделен.

Вместо этого проще всего вручную проверить ваш код и убедиться, что все вызовы cudaMalloc() имеют соответствующий вызов cudaFree().Однако это может быть довольно трудоемким процессом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...