Я пытаюсь понять 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 ГБ памяти.
там, кажется, не так много информации, например, в левом окне, что такое «Я», что такое «вкл.»?
Удивительно, но это первый часто задаваемый вопрос в FAQ по kcachegrind. В частности, по этой ссылке:
… имеет смысл различать стоимость самой функции («Self Cost») и стоимость, включающую все вызываемые функции («Inclusive Cost» [incl.])
Теперь вы не показали ни кода, ни подсказки о том, что делает ваша программа, но …
из того, что я вижу, одинаковое количество пропущенных данных как для 1 ядра, так и для 16 ядер …
Если у вас есть фиксированный объем данных, над которыми нужно работать, и он начинается вне кэша, то разумно, что для его покрытия потребуется столько же промахов.
Вы также не дали никакой информации о вашей аппаратной платформе, поэтому я не знаю, есть ли у вас 16 ядер на одном сокете с унифицированным кэшем последнего уровня, или 4×4, и ваши промахи кэша последнего уровня распределены между этими сокетами, или что.
Но я все еще не могу понять, почему на одном ядре время выполнения составляет 0,62 секунды, в то время как на 16 ядрах время выполнения ближе к 1 секунде
Может быть, это стоимость синхронизации. Может быть, это артефакт бега под Вальгриндом. Может быть, это что-то еще. Возможно, никто не сможет помочь профилировать ваш код без какой-либо информации о коде.
Если кто-то может сказать мне, что искать в kcachegrind …
Что ты пытаешься найти? Что делает ваш код? Разница во времени все еще существует, когда не работает под валгриндом? Какие библиотеки вы используете, какую ОС и какую аппаратную платформу?
Других решений пока нет …