Я разработал код, который получает в качестве входных данных большой 2-D изображение (до 64MPixels) и:Интерпретация вывода перфорация стат
- применяет фильтры на каждой строке
- Транспонирует изображение (используется блокировки, чтобы избежать многих промахов кэша)
- применяет фильтры на колоннах (теперь-строки) изображения
- переставляет отфильтрованное изображение обратно, чтобы продолжить с другими расчетами
Хотя это ничего не меняет, для полноты моего вопроса фильтрация применяет дискретное вейвлет-преобразование, а код записывается в C.
Моя конечная цель - сделать так быстро, как возможное. Ускорение, которое у меня есть до сих пор, более чем в 10 раз за счет использования матрицы блокировки, транспонирования, векторизации, многопоточности, компилятора кода и т. Д.
На мой вопрос: последние профилирующие данные кода, который у меня есть (с использованием perf stat -e
) беспокоили меня.
76,321,873 cache-references
8,647,026,694 cycles # 0.000 GHz
7,050,257,995 instructions # 0.82 insns per cycle
49,739,417 cache-misses # 65.171 % of all cache refs
0.910437338 seconds time elapsed
(# of cache-misses)/(# инструкция) низкий примерно ~ 0.7%. Here упоминается, что это число - хорошая вещь, чтобы иметь в виду проверку эффективности памяти.
С другой стороны,% пропусков кеша к кеш-ссылкам значительно выше (65%!), Что, как я вижу, может указывать на то, что что-то не так с исполнением с точки зрения эффективности кеша.
подробная статистика из perf stat -d
является:
2711.191150 task-clock # 2.978 CPUs utilized
1,421 context-switches # 0.524 K/sec
50 cpu-migrations # 0.018 K/sec
362,533 page-faults # 0.134 M/sec
8,518,897,738 cycles # 3.142 GHz [40.13%]
6,089,067,266 stalled-cycles-frontend # 71.48% frontend cycles idle [39.76%]
4,419,565,197 stalled-cycles-backend # 51.88% backend cycles idle [39.37%]
7,095,514,317 instructions # 0.83 insns per cycle
# 0.86 stalled cycles per insn [49.66%]
858,812,708 branches # 316.766 M/sec [49.77%]
3,282,725 branch-misses # 0.38% of all branches [50.19%]
1,899,797,603 L1-dcache-loads # 700.724 M/sec [50.66%]
153,927,756 L1-dcache-load-misses # 8.10% of all L1-dcache hits [50.94%]
45,287,408 LLC-loads # 16.704 M/sec [40.70%]
26,011,069 LLC-load-misses # 57.44% of all LL-cache hits [40.45%]
0.910380914 seconds time elapsed
Здесь и во внешнем интерфейсе Серверные застопорился циклы также высоки и нижние кэши уровня, кажется, страдает от высокой скорости промаха 57,5%.
Какая метрика является наиболее подходящей для этого сценария? Одна из идей, о которых я подумал, заключается в том, что это может быть так, что рабочая нагрузка больше не требует дальнейшего «касания» кэшей LL после начальной загрузки изображения (загружает значения один раз и после этого это делается - рабочая нагрузка больше связана с ЦП, чем связанный с памятью, являющийся алгоритмом фильтрации изображений).
Машина, на которой я запускаю это, представляет собой Xeon E5-2680 (20M Smart-кеш, из которого кеш L2 на 256 КБ на ядро, 8 ядер).
koukouviou, 'perf stat -d' может быть неточным, может быть полезно повторить его несколько раз с 4-5 событиями за ход,' perf stat -e L1-dcache-load, L1-dcache-load-misses , ООО загружает, ООО загружает-misses'. Если ваши этапы могут быть разделены, вы можете измерить каждый этап, чтобы найти, какой из них генерирует промахи. Или вы можете запустить 'perf record -e cache-misses', чтобы получить профиль кода, который имеет большинство промахов (как было рекомендовано в [« Здесь »] (http://developerblog.redhat.com/2014/03/10/ определение-ли-приложение-имеет-плохой кэш-производительность-2 /), с которым вы связаны). – osgx
@osgx Я сделал тесты, которые вы упомянули, но почта была уже длинной, поэтому я держал ее как можно более кратким. Хотя статистика немного изменилась, по-прежнему статистически схож с высокими промахами кеша%. Я запустил перформанс/отчет/аннотацию, а промахи приписываются в основном ядрам-kallsyms, но я не знаю, что из этого делать ... – koukouviou
koukouviou, вы можете повторно запустить свой stat со всеми событиями, space: 'perf stat -e event1: u, event2: u, ...' и сравнить с опубликованными результатами (по умолчанию измеряются как пользователь, так и ядро). kernel-kallsyms означают, что некоторые функции из пространства ядра имели это событие ... Некоторые возможные проблемы с неизвестными/неразрешенными символами перечислены здесь: http://www.brendangregg.com/blog/2014-06-22/perf-cpu -sample.html. Я не могу дать вам советы по метрикам .... – osgx