Доступ к глобальным данным быстрее, чем к локальным данным? - PullRequest
0 голосов
/ 24 февраля 2019

Вопрос больше в том, как работает DRAM.

(говоря в терминах C) Если у меня есть локальная (расположенная в стеке) переменная и глобальная (статическая или динамически размещаемая) переменная, которая будетдоступ быстрее?Учитывая, что ни один из них не кэшируется и не помещается в регистр!

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

Если время доступа действительно отличается, почему?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Таким образом, вопрос был

, быстрее ли извлечь данные, которые находятся близко к ранее затронутой области, чем извлекать данные, которые находятся в совершенно другом месте

ответ - да, это быстрее.

TL; DR: DRAM имеет буфер (кеш, если хотите, хотя на самом деле это не кеш)

И причина тому - DRAMworkings.

  • A SIMM - это 1 или 2 ранга, которые состоят из нескольких микросхем DRAM ( IC ).SIMM scheme
  • Каждый IC состоит из нескольких банков (строки байтов + декодер строк / столбцов + буфер строк) banks scheme

  • Если IC нумеруются от 0 до K , банки от 0 до M и строки от 0 до N ;
    , то строки( 0 , м , n ), ( 1 , м , n ) ... ( K , m , n ) составляют страницу памяти (данные последовательных адресов).

  • (общий случай) Если у данного SIMM есть 8 микросхем на ранг, а в банке 1024 столбца (каждый по одному байту), размер страницы памяти (или всей буферизованной памяти) составляет 8 КБ.

С учетом вышесказанного, если вы обращаетесь к адресу, который находится на той же странице памяти, что и последний адрес, который был запрошен для этого же банка, будет задействован только декодер столбцов, что примерно в 2 раза быстрее, чем когдаадрес находится на другой странице.Примечание: разница в 2 раза относится только к DRAM и не относится к общему времени, чтобы добраться до ЦП, которое все равно будет> 100 мс.

Есть много деталей, которые нужно добавить, но яЯ совсем не умею это делать.

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

0 голосов
/ 24 февраля 2019

Разницы нет вообще.DRAM работает одинаково независимо от того, находится ли данный адрес в стеке или в куче.На практике есть несколько случаев, когда локальная переменная часто работает быстрее:

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

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

...