Как использовать вывод cachegrind для оптимизации приложения - PullRequest
8 голосов
/ 12 ноября 2009

Мне нужно улучшить пропускную способность системы.

Обычный цикл оптимизации выполнен, и мы уже достигли в 1,5 раза лучшей пропускной способности.

Теперь я начинаю задаваться вопросом, могу ли я использовать вывод cachegrind для улучшения пропускной способности системы.

Может кто-нибудь указать мне, с чего начать?

Что я понимаю, мы должны обеспечить, чтобы наиболее часто используемые данные оставались достаточно маленькими, чтобы они оставались в кэше L1, а следующий набор данных должен помещаться в L2.

Это правильное направление, в котором я иду?

Ответы [ 4 ]

6 голосов
/ 12 ноября 2009

Это правда, что вывод cachegrind сам по себе не дает слишком много информации о том, как оптимизировать код. Нужно знать, как это интерпретировать, и то, что вы говорите о подгонке данных к L1 и L2, действительно является верным направлением.

Чтобы полностью понять, как шаблоны доступа к памяти влияют на производительность, я рекомендую прочитать отличную статью "Уроки, которые должен знать каждый программист" Ульриха Дреппера, сопровождающего GNU libc.

3 голосов
/ 12 ноября 2009

Если у вас возникли проблемы с анализом вывода cachegrind, посмотрите на KCacheGrind (он должен быть доступен в вашем дистрибутиве по вашему выбору). Я использую это и нахожу это весьма полезным.

2 голосов
/ 19 ноября 2009

1,5x - хорошее ускорение. Это означает, что вы нашли что-то, что заняло 33% времени, от которого вы могли бы избавиться. Могу поспорить, что вы можете сделать больше, даже до того, как приступите к проблемам низкого уровня, таким как кэш памяти данных. Это пример того, как. В принципе, у вас могут возникнуть дополнительные проблемы с производительностью (и возможности для ускорения), которые раньше были невелики, как говорят 25%. Что ж, с ускорением в 1,5 раза эти 25% теперь составляют 37,5%, так что это «стоит больше», чем было. Часто такая проблема возникает в виде вызова некоторой функции из среднего стека, которая запрашивает работу, и, как только вы узнаете, сколько это стоит, вы можете решить, что в этом нет необходимости. Поскольку kcachegrind на самом деле не определяет их, вы можете не осознавать, что это проблема.

2 голосов
/ 12 ноября 2009

В соответствии с документацией Cachegrind , данные, предоставленные cachegrind, представляют собой количество пропусков кэша для данной части вашего кода. Вам нужно знать, как кэши работают в архитектуре, на которую вы нацелены, чтобы вы знали, как исправить код. На практике это означает уменьшение данных или изменение схемы доступа к некоторым данным, чтобы кэшированные данные все еще находились в кэше. Однако вам необходимо понять данные вашей программы и доступ к данным, прежде чем вы сможете действовать в соответствии с этой информацией. Как сказано в руководстве,

Короче говоря, Cachegrind может сказать вам, где находятся некоторые узкие места в вашем коде, но он не может сказать вам, как их исправить. Вы должны решить это для себя. Но, по крайней мере, у вас есть информация!

...