Оценка эффективной полосы пропускания ОЗУ в худшем случае с прерывистым доступом к памяти - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь оценить эффективную «полосу пропускания» памяти (пропускную способность в байтах обрабатываемых данных) от основной памяти до процессора в худшем случае: кэш ОЗУ становится совершенно неэффективным из-за больших расстояний в последовательных адресах лечатся. Насколько я понимаю, здесь важна задержка ОЗУ, а не ее пропускная способность (то есть пропускная способность при передаче больших непрерывных блоков данных).

Сценарий таков (скажем, вы работаете с 64-битными = 8-байтовыми значениями):

  • вы читаете данные по адресу
  • сделать несколько легких вычислений процессора (чтобы процессор не был узким местом)
  • тогда вы читаете данные по новому адресу довольно далеко от первого
  • и т. Д.

Мне бы хотелось иметь представление о пропускной способности (скажем, в байтах). Простой расчет, предполагая, что ОЗУ имеет типичную задержку DDR3 13 нс, дает полосу пропускания 8 B / 13 нс = 600 МБ / с. Но это поднимает несколько моментов:

  • правильны ли эти рассуждения (хотя бы схематически)?
  • это время для получения данных точно с задержкой ОЗУ или вам нужно добавить некоторое время, связанное с кешем, процессором или любым промежуточным компонентом? Ты знаешь сколько?
  • что происходит при выполнении этого в нескольких потоках? Будет ли пропускная способность 600 МБ для всех потоков вместе для каждого из них?

1 Ответ

0 голосов
/ 07 мая 2018

... эффективная "пропускная способность" памяти ... от основной памяти к ЦП в худшем случае:

Существует два "худших" сценария: доступ к памяти, который неt использовать (пропустить) кэш-память ЦП и доступ к памяти, которые обращаются к слишком длинным адресам и не могут повторно использовать открытые строки DRAM.

кэш-память ОЗУ

Кэш не является частьюОЗУ, он является частью ЦП и называется Кэш ЦП (верхняя часть иерархия памяти ).

сделан совершенно неэффективным из-за больших расстоянийв последовательных адресах обрабатываются.

Современные кэши ЦП имеют множество встроенных аппаратных средств предварительной выборки , которые могут обнаруживать неслучайные шаги между несколькими обращениями к памяти.Многие префретчеры обнаружат любой шаг внутри выровненной страницы размером 4 килобайта (КБ): если вы обращаетесь к адресу address1, затем address1 + 256 байт, тогда prefetcher L1 запустит доступ по адресу address1 + 256 * 2, address1 + 256 * 3 и т. Д.прогнозировать из диапазона 4 КБ.Таким образом, использование только больших расстояний между доступами может быть недостаточно.(prefetchers могут быть отключены https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors)

Насколько я понимаю, здесь важна задержка ОЗУ, а не ее пропускная способность

Да, есть некоторые режимы, когда ОЗУдоступ ограничен по времени ожидания.

Сценарий таков (скажем, вы работаете с 64-битными значениями = 8 байтов):

Вы можете работать с 8-байтовыми значениями, но выСледует учитывать, что память и кэш работают с большими единицами. Современная память DRAM имеет шину шириной 64 бита (8 байт) (72 бита для 64 + 8 в случае ECC), и во многих транзакциях может использоваться несколько тактов шины (предварительная выборка в DDR4 SDRAM использует 8n - 8 * 64 бита. Многие транзакции между кэш-памятью ЦП и контроллером памяти также больше и имеют полный размер строка кэша или половину строки кэша. Типичный кэшдлина строки составляет 64 байта .

you read data at an address
make some light weight CPU computation (so that CPU is not the bottleneck)
then you read data at new address quite far-away from the first one

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

Классические тесты для кэш-памяти процессора и задержки памяти (lat_mem_rd из lmbench http://www.bitmover.com/lmbench/lat_mem_rd.8.html и многих других) используют массив памяти, заполненный каким-то специальным псевдослучайным шаблоном указателей;и тест на задержку чтения подобен (https://github.com/foss-for-synopsys-dwc-arc-processors/lmbench/blob/master/src/lat_mem_rd.c#L95)

char **p = start_pointer;
for(i = 0; i < N; i++) {
      p = (char **)*p; 
      p = (char **)*p; 
  ... // repeated many times to hide loop overhead
      p = (char **)*p; 
}

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

Мне бы хотелось иметь представление о пропускной способности (скажем, в байтах).

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

Иногда измеряется аналогичное значение - GUPS - обновления guga в секунду (данные в памяти считываются, обновляются и записываются) с тестом Random Access . Этот тест может использовать память вычислительного кластера сотен (или десятков тысяч)) ПК - проверьте столбец GUP / s в http://icl.cs.utk.edu/hpcc/hpcc_results.cgi?display=combo

Простой расчет, предполагающий, что ОЗУ имеет типичную задержку DDR3 13 нс, дает полосу пропускания 8 B / 13 нс = 600 МБ / с.это поднимает несколько поints:

RAM имеет несколько задержек (таймингов) - https://en.wikipedia.org/wiki/Memory_timings

И 13 нс CAS имеет значение только при доступе к открытой строке.При случайном доступе вы часто получаете доступ к закрытой строке, и в CAS добавляется задержка T_RCD.

...