Нужна помощь в понимании kcachegrind

Я пытаюсь понять kcachegrind, кажется, что там не так много информации, например, в левом окне, что такое "Self", что такое "incl."? (см. 1 ядро).

Я провел несколько слабых тестов масштабирования, связи нет, поэтому я думаю, что это связано с отсутствием кэша. Но из того, что я вижу, одинаковое количество пропущенных данных как для 1 ядра, так и для 16 ядер, см.: 16 ядер.

Единственное различие, которое я вижу между 1 ядром и 16 ядрами, состоит в том, что на 16 ядрах обращений к memcpy значительно меньше (что я могу объяснить). Но я до сих пор не могу понять, почему на одном ядре время выполнения составляет 0,62 секунды, а на 16 ядрах время выполнения ближе к 1 секунде. Каждый процессор выполняет одинаковое количество работы. Если бы кто-то мог сказать мне, что искать в kcachegrind, это было бы замечательно, я впервые использую kcachegrind и valgrind.

Изменить: мой код сцепления матриц в сжатом формате строки. Он включает в себя циклический просмотр записей подматриц и использование memcpy для копирования значений в матрицу результатов. Вот код: - Я не могу опубликовать более 2 ссылок... поэтому я опубликую это в комментарии.

Я только инициировал valgrind на самом цикле, цикл также имеет значение между временем выполнения 0,62 секунды и временем выполнения 1 секунда. Часть, которая занимает больше всего времени, - это вызов memcpy (строка 37 в github gist ниже), когда я закомментирую это, мой код выполняется менее чем за 0,2 секунды, хотя все еще увеличивается от 1 до 16 ядер (около Увеличение на 30%).

Я выполняю свой код на узле haswell, который состоит из 24 ядер (два процессора Intel® Xeon® E5-2690 v3)

Каждое ядро ​​имеет 5 ГБ памяти.

1 ответ

там, кажется, не так много информации, например, в левом окне, что такое "Я", что такое "вкл."?

Удивительно, но это первый часто задаваемый вопрос в FAQ по kcachegrind. В частности, по этой ссылке:

... имеет смысл различать стоимость самой функции ("Self Cost") и стоимость, включающую все вызываемые функции ("Inclusive Cost" [вкл.])

Теперь вы не показали ни кода, ни подсказки о том, что делает ваша программа, но...

из того, что я вижу, одинаковое количество пропущенных данных как для 1 ядра, так и для 16 ядер...

Если у вас есть фиксированный объем данных, над которыми нужно работать, и он начинается вне кэша, то разумно, что для его покрытия потребуется столько же промахов.

Вы также не дали никакой информации о вашей аппаратной платформе, поэтому я не знаю, есть ли у вас 16 ядер на одном сокете с унифицированным кэшем последнего уровня, или 4x4, и ваши промахи кэша последнего уровня распределены между этими сокетами, или что.

Но я все еще не могу понять, почему на одном ядре время выполнения составляет 0,62 секунды, в то время как на 16 ядрах время выполнения ближе к 1 секунде

Может быть, это стоимость синхронизации. Может быть, это артефакт бега под Вальгриндом. Может быть, это что-то еще. Возможно, никто не сможет помочь профилировать ваш код без какой-либо информации о коде.

Если кто-то может сказать мне, что искать в kcachegrind...

Что ты пытаешься найти? Что делает ваш код? Разница во времени все еще существует, когда не работает под Valgrind? Какие библиотеки вы используете, какую ОС и какую аппаратную платформу?

Другие вопросы по тегам