Comments 58
Если память горячая (более 85°C), то время хранения данных в памяти падает, а время статического обновления снижается вдвое до 32 Microsoft.
Это очень крутая опечатка :) Единица лагания — один Микрософт.
Нужен фундаментальный закон, из которого 1 MS выводится однозначно.
Уверен, что оно существует.
Микрософт довольно маленькая величина. Миллисофт побольше, а Софт уже очень большая. Также есть Пикософт и Фемтософт, но их зафиксировать трудно.
… шарообразным абсолютно упругим абсолютно чёрным пользователем ...
Это уже какой-то эталон из области политкорректности.
И ПО надо какое-то явно определить эталонное. Либо через объём кода, мб энтропию…
диаметром в один метр и весом в один килограмм за одну секунду. В вакууме, разумеется.
Вот так вот и проявляется корпускулярно-волновой дуализм мата.
Оригинал:
// Perform memory load. Any will do
*(volatile int *) one_global_var;
Перевод:
// Загрузка памяти. Любая инструкция загрузки делает
*(volatile int *) one_global_var;
Вроде мелочи, но смысл практически на противоположный меняется — можно подумать, что чип нормально продолжает заниматься обычной работой параллельно с обновлением данных в ячейках. А на самом деле нет, не может — все курят бамбук, до тех пор пока он не закончит обновление. Собственно поэтому и задержки, если бы это шло в фоновом режиме, никаких задержек просто не было.
C содержит комплексные числа частотных компонентов. Нас не интересуют комплексные числа, и можно сгладить их командой abs()
Функция abs() не «сглаживает» комплексные числа, а извлекает модуль (амплитуду).
В программах Aida и подобных ей замечал характеристику памяти:
«Частота регенерации памяти = 7.8 µs”
tRFC (сколько занимает это самое обновление) в расширенных таймингах памяти так же указывается (и пишется во вспомогательный чип на модуле памяти — SPD).
Только не в наносекундах, а в тактах привязанных к частоте работы самой памяти. Например в компьютере с которого сейчас пишу:
9-9-9-27 (CL-RCD-RP-RAS) / 36-128-0-5-12-6-6-24 (RC-RFC-CR-RRD-WR-WTR-RTP-FAW)
RFC=128 тактов
рабочая частота 1600 МГц
1/1600000000*128=80 нс
По столько времени DRAM память тупит («уходит в себя») при каждом обновлении, трогать ее в этот момент не моги (с).
В данном примере получается память примерно 1% рабочего времени занимается обновлением и недоступна: 80/7800 = 0.01026 ~ 1%
Информация интересная, спасибо.
Хинт — большинство попсовых компиляторов поддерживают интристик __rdtsc();
P.S. А affinity вы же выставляли в ваших экспериментах? А то весь этот "шум" как и наблюдаемые данные, могли оказаться переключениями контекста. Ну а как известно, кто ищет — тот всегда найдёт...
Да, об этом я не подумал. Там же нет блокирующих вызовов, по идее такой пик если и попадёт то будет далеко выпадать на фоне остальных замеров.
Имеем 2 параллельных сердечника с последовательно-встречно намотанными катушками, один из которых с условным пермаллоем, второй — с воздушным сердечником (к примеру пластик). Если есть сильное внешнее поле, то пермаллой насыщается. Тогда, если в катушки дать прямоугольный импульс, то на измерительной (охватывает оба сердечника) катушке суммарное поле будет нулевым. А вот если внешнее поле слабое, то катушка с пермаллоем будет преобладать и мы регистрируем единичку. В таком варианте чтение ничего не стирает и управление записью и чтением разделено.
Плохо, что такие решения были громоздкими, потому и не пережили конкуренции
Это как-то влияет на производительность? Или можно пренебречь? Может, лучше греть память и получать рекорды, вместо глубокой заморозки азотом?
И как заморозка влияет на частоту и время обновления?
Больше температура, больше моментов обновления => память чаще недоступна.
Так что надо охлаждать, чтобы не перегревалась
В нашей машине ППЗУ было такое. На биаксах построено. Машина 5Э26.
Теперь нужно нагреть память и обнаружить новую нулевую гармонику.
Гипертрединг наверное тоже лучше выключить.
А вот как отфильтровать переключения контекста у меня пока идей нет. По идее переключение туда-обратно должно занимать хотя бы 1 мкс, но было бы круто это проверить.
В современном CPU несколько ядер + гипертрейдинг. По пути от CPU до памяти конвейер 2 или 3 шины, спекулятивное исполнение и 3 уровня кэша. Параллельно происходят прерывания, DMA доступ, в ряде случаев(интегрированная графика) графический чип лезет в ту же память за своими данными. Битность шины памяти никак не учитывается, количество каналов тоже, и, как мне кажется, современные модули DRAM обновляют память прозрачно для шин памяти. Автор скорее всего поймал частоту какого-нибудь системного таймера, тяжело и долго переключающего процессы и контексты, а вовсе не memory refresh.
1. Память разделена на 'ряды' (rows) (и 'банки', но это не так важно). При первом чтении из ряда, он 'открывается' и остаётся открытым. Последующие чтения идут уже из открытого ряда и следовательно они быстрее.
2. При рефреше открытый ряд (каким бы он ни был) закрывается и выдаётся команда рефреша. При последующем обращении к тому же ряду он снова открывается.
Таким образом, в статье виден именно процесс торможения при открытии ряда, вызванный в том числе и рефрешем. Если последовательно читать из разных рядов (в пределах одного банка), то такое 'торможение' будет происходить при каждом чтении (т.к. в одном банке открыт может быть только 1 ряд)
Память вашего компьютера лагает каждые 7,8 мкс