... эффективная "пропускная способность" памяти ... от основной памяти к ЦП в худшем случае:
Существует два "худших" сценария: доступ к памяти, который не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.