Я пытаюсь понять kcachegrind, там, похоже, не так много информации, например, в левом окне, что такое «Я», что такое «вкл.»? (см. 1 core).Нужна помощь в понимании kcachegrind
Я сделал некоторые слабые тесты масштабирования, коммуникации нет, поэтому я предполагаю, что это связано с промахами кеша. Но из того, что я вижу, существует такое же количество промахов данных как для 1 ядра, так и для 16 ядер, см.: 16 cores.
Единственное отличие, которое я вижу между 1 сердечником и 16 ядром, заключается в том, что на memcpy значительно меньше звонков на 16 ядер (что я могу объяснить). Но я все еще не могу понять, почему на одном ядре время выполнения составляет 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 Гб памяти.
Вот код: https://gist.github.com/anonymous/fc32abc68c5b4b6d0986 – user302157
И как этот однопоточный код работает через 16 ядер? Это всего лишь один поток, получающий контекстную коммутацию повсюду, или есть что-то еще, что вы не показывали? – Useless
Матрицы автоматически распределяются. Таким образом, если я получу row_start, он получит только строку row_start для той части матрицы, которая находится на этом ядре. Точно так же, если я получу количество ненулевых (NNZ), он вернет NNZ только для записей этого ядра. В этом алгоритме нет необходимости обращаться к данным на других ядрах, поэтому он выглядит однопоточным. Однако каждая memcpy будет копировать разные данные в зависимости от того, на каком ядре они находятся. Однако, если я хочу получить доступ к части матрицы, которая находится на другом ядре, тогда мне придется вызывать вызовы MPI. – user302157