Страница 1 из 2

Время доступа к памяти

СообщениеДобавлено: 27.09.2016 04:32:02
CRobin
Обратил внимание, что при регулярной записи в память с разным интервалом времени скорость записи падает или уменьшается в следующей зависимости
Изображение

Есть у кого версии почему так происходит и что нужно для сокращения задержки, если запись происходит реже чем каждые 100 мс?

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 04:59:26
Mirage
Попробую потелепатить: почему - кончается кэш. Что делать - префетч.
А так код надо смотреть.
А что на графике, кстати? Что по Х, что по У?

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 05:28:06
CRobin
Mirage по Х интервал, с которым в цикле вызывается функция записи, по У время выполнения записи. Что вы понимаете под кончается кеш? То что данные в кеше вытесняются другими процессами? Кеш в данном случае ЦП имеется в виду или есть что то еще? И что такое префетч? Код весьма тривиальный, например для случая, когда интервал вызова нарастает в степени 4, на 40й итерации пауза между вызовами записи мудет 810мс:
Код: Выделить всё
  for i:=0 to 40 do
  begin
    k := i-10;
    if k > 0 then DelayUS(k*k*k*k);
    t1 := tsc;
    FillChar(tmp, Length(tmp), 'a');
    t2 := tsc;
    arr[i] := Diff(t2,t1);
  end;   

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 10:04:06
runewalsh
>по У время выполнения записи
В чём, наносекундах? В пределах погрешности, если у тебя tmp не гигабайтного размера.

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 16:00:01
CRobin
runewalsh сколько байтов записываете, такая задержка и будет, мало заполняете будут наносенкунды, много заполняете будут микросекунды. График от этого не меняется.

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 18:25:50
runewalsh
Всё равно уверен, что дело в таймере. Чтобы «точно» замерить скорость участка кода, нужно сделать это много раз, отбросить, условно, 40% максимальных значений и 10% минимальных и усреднить остальные. Ты ведь этого не делаешь. Попробуй. Ещё можешь попробовать обходить задержки в обратном порядке. Если график таким и останется, становится чуть интересней, да.

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 19:18:47
CRobin
runewalsh предложенная методика очень слабая, если ограничится только этими мерами, стационарного распределения все равно не получить. Я не буду останавливаться на том, как делались тесты, вы можете провести их в меру своего понимания, меня больше интересует как интерпретировать полученый результат.

Добавлено спустя 8 минут 8 секунд:
да, при изменении интервалов в обратном порядке картинка зеркалится

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 23:15:39
Pavia
CRobin писал(а):runewalsh сколько байтов записываете, такая задержка и будет, мало заполняете будут наносенкунды, много заполняете будут микросекунды. График от этого не меняется.

Ошибка в коде. У вас вместо результатов замеров выводится что-то несвязанное.

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 23:18:45
CRobin
Pavia что вы имеете в виду?

Re: Время доступа к памяти

СообщениеДобавлено: 27.09.2016 23:57:35
Pavia
Решил по мерить никакой ямы нет.
При цифрах 3, 4, 5 это порядоку 10^3, 10^4, 10^5 мкс начинает работать вытесняющая многозадачность. ОС отдаёт кванты времени другим потокам.
Изображение
upload

Интересно другое при размере массива 40 000 имеем яму в районе 1 мс.

Изображение
куда залить картинку

Добавлено спустя 11 минут 45 секунд:
Возможно это связано с вытеснением задач. При этом происходит сброс кэша. Так как тест ориентирован на запись прирост достигает за счет наличия пустого кэша. А при заполненном он вынужден тормозить чтобы скинуть старые записи.

Re: Время доступа к памяти

СообщениеДобавлено: 28.09.2016 01:16:45
CRobin
Pavia
1) Каким образом у вас запись с холодного старта имеет минимальную задержку на первом графике? Вас это никак не смущает?
2) У вам время записи растет в пять раз относительно минимального и вас снова это почему то не смущает.
3) При чем тут кванты времени, вы что отдаете управление между итерациями? Нужно паузу между измерениями заполнять холостой нагрузкой, выставлять потоку приоритет реального времени и выполнять его все время на одном ЦП. Уже не говоря уже о том, что сама ОС должна быть готова к подобным задачам.

В данном случае ваши результаты мягко говоря "не о том"

Re: Время доступа к памяти

СообщениеДобавлено: 28.09.2016 01:55:38
Ism
1 Есть такая штука как фрагментация памяти, возможно поэтому при старте все быстро

Re: Время доступа к памяти

СообщениеДобавлено: 28.09.2016 03:23:11
CRobin
Ism запись происходит в одну и ту же область памяти.

Re: Время доступа к памяти

СообщениеДобавлено: 28.09.2016 07:33:01
Pavia
CRobin писал(а):1) Каким образом у вас запись с холодного старта имеет минимальную задержку на первом графике? Вас это никак не смущает?

Не сразу заметил. Она там есть. Так просто компонент выводит. Надо чуть в бок сдвинуть.
Система давно не холодная в неё уже всё есть стек выделен и так далее. Так что откуда при 0 замере берётся скачок не ясно. При следующем проходе задержки нет.

У вам время записи растет в пять раз относительно минимального и вас снова это почему то не смущает.

Нет не смущает. Я это объясняю вытесняющей многозадачностью. Она может не в 5 раз а в 100 раз доходить.
На интервале 1 мс - 4 секунды бесполезно, что либо мерить. многозадачность вносит большие ошибки.

При чем тут кванты времени, вы что отдаете управление между итерациями?

Я не отдаю ОС сама берёт и вытесняет задачу. Вы с этим как боретесь?
Лично я методически не мерить на озвученном диапазоне. Во вторых методическая ошибка хорошо изучена.
При диапазоне менее 1 мс точность доходит до 0.1-0.01% т.е, Меня более чем устраиват

Сейчас ОС не подготавливалась. Задача у меня всегда привязана к 1 ядру. Замер ошибок за 10 секунд.
Размер максимального выброса
Max=0,006701 секунды
dt =0,023198492 секунды - шаг между выбросами
NMax=494 - число выбросов за 10 секунд

Шумновато, если всё по закрывать таких выбросов только 100. А вот если совсем остановить все задачи тогда можно и ниже но я не пробовал.

Добавлено спустя 3 часа 21 минуту 31 секунду:
Погонял по мерил. Если код FillChar не гонять, то при первом запуске имеем посадку. Код не попал в кэш. Делаем прогон по коду. Я сделал прогон по статический массив, чтобы со стеком не пересекался - не влиял на кэш данных. Задержка с 300 тактов упала до 40-60 тактов, что равно скорости записи при последующих проходах.

Добавлено спустя 29 минут 5 секунд:
Увеличил массив с 40 до 4 000 затем 40 000, чтобы понять где прирост где просадка.
Изображение
Видимо работает кэш и/или система предсказания(prefetch)
С течением времени её сбивают прерывания и вытесняющая многозадачность.

Re: Время доступа к памяти

СообщениеДобавлено: 28.09.2016 16:31:08
CRobin
Pavia вытесняющая многозадачность не причем, если запись/вычисление длится 20мкс (запись ~300000 байтов) то тут некуда вклиниваться. Многозадачность может вносить искажения в тест тем, что паузы будут больше, чем должны быть, если вы отдаете управление в цикле. Но разницы в десятки раз тут никак не может быть. Либо же многозадачность влияние на механизм кэширования, здесь интереснее. Вопервых не понятно о каком кеше идет речь? Речь о кеш памяти ЦП, или в ОЗУ тоже есть нечто такое? Во вторых, если о ЦП, кешируется и вытесняется код приложения, или же область памяти, куда происходит запись?