2010-04-29 4 views
2

Предположим, у меня есть два сегмента памяти (одинаковый размер, размер приблизительно 1 килобайт), один - только для чтения (после инициализации), а другой - чтение/запись.Оптимальная схема памяти для сегментов памяти только для чтения/записи

Какова наилучшая компоновка памяти для таких сегментов с точки зрения производительности памяти? одно распределение, смежные сегменты или два распределения (в общем, не смежные). моя основная архитектура - это 64-разрядная версия Linux.

мой ощущение - прежний (кейс более дружелюбный) случай - лучше. Есть ли обстоятельства, где предпочтительна вторая компоновка?

+0

Существует так много факторов, которые пытаются использовать обе альтернативы и, используя самые быстрые, - это, пожалуй, самый простой и надежный подход. – mdma

+0

@mdma спасибо. Я хотел услышать некоторые материалы о плюсах и минусах двух макетов. Кстати, ваше имя относится к extasy или я читаю его неправильно? – Anycorn

ответ

4

Я бы поставил 2 Кбайт данных в середине страницы 4 КБ, чтобы избежать помех от чтения и записи вблизи границы страницы. Аналогичным образом, сохранение отдельных данных записи также является хорошей идеей по той же причине.

Наличие смежных блоков чтения/записи может быть менее эффективным, чем их разделение. Например, кеш, который хранит данные для кода, интересующегося только частью только для чтения, может стать недействительным в результате записи из другого процессора. Линия кэша будет недействительной и обновлена, даже если код не читает записываемые данные. Сохраняя блоки отдельно, вы избегаете этого случая и записываете в записываемый блок данных только для недействительных строк кэша для записываемого блока и не мешаете строкам кэша для блока только для чтения.

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

+0

Почему вы беспокоитесь о середине страницы? вы можете добиться того же результата, выровняв блок со страницей и заполнив как блоки чтения, так и блоки чтения/записи, чтобы выровнять линию строки. На уровне страницы нет проблемы с ложным распространением, а только строка кэша. –

1

Это будет зависеть от того, что вы делаете с памятью. Я вполне уверен, что смежные (и выравниваемые страницы!) Никогда не будут медленнее, чем два случайно расположенных сегмента, но это не обязательно будет быстрее.

+0

моей главной проблемой является переполнение кэша. 1kb сегменты достаточно малы, где это не касается? честно говоря, эффективное использование кеша по-прежнему темное для меня – Anycorn

+1

2KB должно быть в состоянии поместиться в кеш L1 (по крайней мере, на современных чипах x86), без проблем, вероятно, соответствующий код также будет вписываться, если предположить, ориентированный. Он также легко вписывается в кеш-память L2 с огромным количеством свободного места на большинстве последних процессоров (L2 обычно измеряется в ** M ** Bs). Если вы собираетесь получать доступ к обоим сегментам очень часто, это не может повредить их объединению и выравниванию по страницам. – Kitsune

1

Учитывая, что это процессор Intel, вам, вероятно, нужно только обеспечить, чтобы адреса не были точно кратными 64k друг от друга. Если они есть, нагрузки из любой секции, которая сопоставляется с тем же адресом по модулю 64k, будут сталкиваться в L1 и вызывать пропуски L1. Там также проблема с псевдонимом 4 МБ, но я был бы удивлен, если бы вы столкнулись с этим.

2

С этим небольшим количеством данных это действительно не имеет большого значения. Оба этих массива будут вписываться в кеш уровня любого уровня.

+0

+1 для указания абсурда вопроса –

Смежные вопросы