Отслеживание ненужных копий с помощью callgrind - PullRequest
1 голос
/ 11 июля 2020

Я работаю над проектом C ++ (трассировщик лучей), и я пытался оптимизировать кодовую базу. Я не специалист по C ++ и уверен, что сделал много ошибок новичков, особенно в отношении случайных копий (см. Ниже). Я пытался найти горячие области своего кода, но замечаю, что пара верхних строк вывода в callgrind_annotate в основном являются вызовами внутренней памяти:

--------------------------------------------------------------------------------
Ir          
--------------------------------------------------------------------------------
195,515,649  PROGRAM TOTALS

--------------------------------------------------------------------------------
Ir          file:function
--------------------------------------------------------------------------------
14,526,540  src/matrix.cpp:matrix::operator*(tuple const&) const [./rt.debug.exe]
10,603,101  ???:_platform_memmove$VARIANT$Haswell [/usr/lib/system/libsystem_platform.dylib]
 7,481,047  ???:tiny_free_no_lock [/usr/lib/system/libsystem_malloc.dylib]
 7,290,995  ???:tiny_free_list_add_ptr [/usr/lib/system/libsystem_malloc.dylib]
 6,463,127  ???:szone_malloc_should_clear [/usr/lib/system/libsystem_malloc.dylib]
 6,411,076  ???:szone_size [/usr/lib/system/libsystem_malloc.dylib]
 6,268,455  src/tuple.cpp:tuple::tuple(double const&, double const&, double const&, double const&) [./rt.debug.exe]
 4,726,152  src/scene_objects/scene_object.cpp:scene_object::intersect(ray) [./rt.debug.exe]
 4,705,650  ???:tiny_malloc_from_free_list [/usr/lib/system/libsystem_malloc.dylib]
 4,415,582  ???:free [/usr/lib/system/libsystem_malloc.dylib]
 ...

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

Итак, как я могу лучше отслеживать , что вызывает эти дополнительные выделения / освобождения памяти?

Примечание: я уже компилирую с -g и -O3.

1 Ответ

0 голосов
/ 11 июля 2020

valgrind предоставляет несколько способов отследить код, который выполняет множество операций выделения / освобождения.

Среди прочего, инструменты valgrind memcheck и massif предоставляют способ записи полного набора вызовов выделения и освобождения функции. Записанные данные можно затем визуализировать с помощью таких инструментов, как kcachegrind.

Например, с помощью memcheck вы можете:

valgrind --tool=memcheck --xtree-memory=full <your_program> <your_args>

Это затем (по умолчанию) создаст файл xtmemory. kcg., который вы можете визуализировать с помощью kcachegrind.

См. https://www.valgrind.org/docs/manual/manual-core.html#manual -core.xtree для получения дополнительной информации.

Инструмент dhat также позволяет проверить, какая память выделено, но не используется много или долго.

...