LINUX.ORG.RU

[C] тест на эффективность кэшей

 


0

1

Какой бы тест соорудить чтобы можно было видеть что вот при таком объёме данных всё летает, а вот при таком cache misses и всё тормозит?

Пробовал прыгать по рандомным элементам массива, но random() прилично ресурсов жрёт(для этого теста) и как-то на его фоне не очень убедительная картина. Что же делать? Может надо было заранее нагенерить рандомных чисел?

А может какой-нить хитрый граф в памяти построить и его обходить? Но как?

Или вообще есть готовые тесты этого?

PS если что, интересует в первую очередь L2.

★★★★★

Блочный обмен данными с памятью?

При размерах блока, равных обьемам L1/L2/L3 кешей, будут провалы.

devl547 ★★★★★
()
Ответ на: комментарий от devl547

Ммм, ты имешь в виду memmove/memcpy кусками? А можешь привести пример на псевдокоде?

true_admin ★★★★★
() автор топика

Вот к чему это? Если интересует оптимизация, потрать время на улучшение алгоритма/структур данных и получишь гарантированное улучшение производительности вместо зависимости от размера L2, который варьируется от процессора к процессору.

sched
()

Или вообще есть готовые тесты этого?

cachegrind?

или Вас больше интересует туториал по написанию cache-effective программ?

shty ★★★★★
()

вспомнил, натыкался какое то время назад на измышления одного кренделя, вот, может поможет

shty ★★★★★
()
Ответ на: комментарий от shty

cachegrind?

не, это инструмент, а мне нужны программы и алгоритмы где видно разницу в скорости в зависимости от, например, размера входных данных или объёма кешей.

или Вас больше интересует туториал по написанию cache-effective программ?

Не, спасибо. Я на эту тему читал(частично) Ульриха Дрипера «What every programmer should know about memory» и разные доки от интеля и амд. Теперь хочу увидеть своими глазами. Причём, желательно, на примере простой программы.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от Kosyak

Могу исходники поискать.

Если не сложно то поищи пожалуйста. Чтобы мне не вбивать.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от Reset

Напиши блочное умножение матриц и поиграйся с размером блока.

спасибо, так и сделаю.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от shty

вот, может поможет

спасибо, почитаю.

true_admin ★★★★★
() автор топика

Блочное умножение матриц.

anonymous
()

> но random() прилично ресурсов жрёт

первое, что приходит в голову — просто в начале нагенерить рандомных индексов, а затем уже последовательно брать эти индексы и ходить по ним по массиву.

время генерации рандомных индексов, очевидно, в тесте не учитывать.

Remington
()
Ответ на: комментарий от KRoN73

Да я думаю тут это не особо влияет. Впрочем, померяю - узнаю.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Не совсем уловил. Какое отношение seed имеет к предложенному способу исключить генерацию рандомной последовательности из теста?

2true_admin: Я же правильно понял, ты хочешь эмпирически подобрать размер сплошной области памяти, такой, что её будет нельзя увеличить без существенного увеличения количества промахов кеша данных при условии случайного доступа к этой области памяти? И проблема с рандом заключалась в том, что он сильно влиял на результат?

кстати, кешграйнд я бы всё же заюзал, т.к. засекать время будет очень уж неточно. А у кешграйнда даже метрика подходящая есть — количество промахов кеша (данных/инструкций) для определённого куска кода

Remington
()
Ответ на: комментарий от Remington

Вообще хочу посмотреть влияние одних процессов в системе на другие. Кэш-то общий для всех программ. При переключении контекста данные одной программы могут быть вытеснены, что и происходит на практике.

кешграйнд я бы всё же заюзал

А я его активно юзаю :).

засекать время будет очень уж неточно.

Нуу, надо просто в тестах учитывать неточность часов. Уж с точностью до 0.1с любой таймер сгодится.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

>Нуу, надо просто в тестах учитывать неточность часов. Уж с точностью до 0.1с любой таймер сгодится.

ненене, я про другого рода неточность- про ту, которая вызвана многозадачностью системы.

Вообще хочу посмотреть влияние одних процессов в системе на другие. Кэш-то общий для всех программ. При переключении контекста данные одной программы могут быть вытеснены, что и происходит на практике.

хм. Даже и не знаю, что бы я на твоем месте делал. Поделись, плиз, результатами, как закончишь

Remington
()
Ответ на: комментарий от Remington

про ту, которая вызвана многозадачностью системы.

результаты стабильны даже если не убивать браузер и скайп. Хотя я щас остановил всё что смог и выполняю тесты удалённо. Даже вывод программ в /dev/null отправил т.к. это сильно влияет при большом выводе.

результатами

Нуу отправная точка такая: есть 4 процесса запущенных core 2 duo с 3m кеша: два cache-aware и два нет. Это программы по data mining, что-то там обсчитывают. Делают одно и тоже, только написаны по-разному. Так вот неоптимизированные процессы на ~40% снижают нормализованную скорость cache-aware прог. При том что сами они падения производительности не показывают. Тут много что влияет, например, настройки планировщика задач.

Собстно какую я решаю задачу: хочу детально разобраться в вопросе потому что та прога что написали прогеры очень сильно лагает на больших датасетах. Нужно решить проблему. Я двигаюсь в двух направлениях: 1) уменьшить потребляемую память(чтоб в кэш лучше влезло) 2) сделать memory access более линейным и предсказуемым путём изменения структуры данных и алгоритмов обработки. Щас прога внутри сильно прыгает по указателям(всё хранится в графе) и очень страдает от cache misses. Я подозреваю что это можно оптимизировать. Короче, стараюсь подойти со всех фронтов.

true_admin ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.