оптимальное расположение памяти для сегментов памяти только для чтения / записи - PullRequest
2 голосов
/ 29 апреля 2010

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

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

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

Ответы [ 4 ]

4 голосов
/ 04 мая 2010

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

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

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

2 голосов
/ 10 мая 2010

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

1 голос
/ 07 мая 2010

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

1 голос
/ 29 апреля 2010

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

...