Кэш C++ осведомленное программирование

существует ли путь в C++ для определения размера кэша ЦП? у меня есть алгоритм, который обрабатывает много данных, и я хотел бы разломать эти данные, на разделяет на блоки таким образом, что они вписываются в кэш. Действительно ли это возможно? Можно ли дать мне какие-либо другие подсказки при программировании с размером кэша в памяти (особенно в отношении многопоточной/многоядерной обработки данных)?

Спасибо!

56
задан Ian Ringrose 30 July 2010 в 09:25
поделиться

7 ответов

Сам C ++ "не заботится" о Кеши ЦП, поэтому в языке нет поддержки для запросов размеров кеша. Если вы разрабатываете для Windows, то есть функция GetLogicalProcessorInformation () , которую можно использовать для запроса информации о кэшах ЦП.

11
ответ дан 26 November 2019 в 17:31
поделиться

считывает cpuid процессора (x86), а затем определяет размер кэша с помощью справочной таблицы. Таблица должна быть заполнена размерами кэш-памяти, которые производитель процессора публикует в своих руководствах по программированию.

4
ответ дан 26 November 2019 в 17:31
поделиться

В зависимости от того, что вы пытаетесь сделать, вы также можете оставить это какой-нибудь библиотеке. Поскольку вы упомянули многоядерную обработку, вы можете взглянуть на Intel Threading Building Blocks .

TBB включает в себя распределители памяти с учетом кеширования. В частности, проверьте cache_aligned_allocator (в справочной документации я не нашел прямой ссылки).

4
ответ дан 26 November 2019 в 17:31
поделиться

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

-1
ответ дан 26 November 2019 в 17:31
поделиться

Согласно "Что каждый программист должен знать о памяти", Ульрихом Дрепером в Linux можно сделать следующее:

Как только у нас будет формула для памяти требование можно сравнить с размер кэша. Как уже упоминалось ранее, размер кэш можно совместно использовать с несколькими другие ядра. В настоящее время определённо когда-нибудь скоро будет лучший способ! Единственный способ получить правильная информация без жесткого кодирования знание через /исей Файловая система. В таблице 5.2 мы видели о том, что ядро публикует оборудование. Программа должна найти каталог:

/sys/devices/system/cpu/cpu*/cache

Это перечислено в Разделе 6: Что могут делать программисты.

Он также описывает краткий тест, который можно использовать для определения размера кэша L1D, если вы не можете получить его из операционной системы.

Есть еще одна вещь, на которую я наткнулся в его статье: sysconf(_SC_LEVEL2_CACHE_SIZE) - это системный вызов под Linux, который должен вернуть размер кэша L2, хотя, похоже, это не очень хорошо документировано.

15
ответ дан 26 November 2019 в 17:31
поделиться

Предварительно выделить большой массив. Затем последовательно обращайтесь к каждому элементу и записывайте время для каждого доступа. В идеале при промахе кеша произойдет скачок во времени доступа. Затем вы можете рассчитать свой кэш L1. Это может не сработать, но стоит попробовать.

8
ответ дан 26 November 2019 в 17:31
поделиться

Интересно, что я написал программу для этого некоторое время назад (хотя и на C, но я уверен, что ее будет легко включить в код C++).

http://github.com/wowus/CacheLineDetection/blob/master/Cache%20Line%20Detection/cache.c

Функция get_cache_line интересна тем, что возвращает местоположение непосредственно перед самым большим всплеском временные данные доступа к массиву. Он правильно угадал на моей машине! Во всяком случае, это может помочь вам сделать свой собственный.

Он основан на этой статье, которая изначально меня заинтересовала: http://igoro.com/archive/gallery-of-processor-cache-effects/

4
ответ дан 26 November 2019 в 17:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: