Чтение\запись памяти

Тема в разделе "WASM.A&O", создана пользователем The_GorYnycH, 29 май 2008.

  1. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    Конфигурация:

    8*AMD Opteron 8350
    128Gb RAM DDR2 667
    ОС - Windows Server 2008.

    Решил потестировать производительность вышеуказанного сервера, в частности работу подсистемы памяти. Сначала воспользовался тестами типа сандры и rmma, последний кстати отказался запускаться. Сандра показала скорость около 10ГБ\с на узел(т.е. на проц и прицепленную к нему память). Далее сам написал следующий тест:
    1. На нулевом узле выделяю половину памяти - 8ГБ, передаю ее, чтоб потом не тратилось время на обращение. На стеке создаю небольшой буфер в 2К, заполняю мусором.
    2. На этом же узле запускаю поток, выставляя ему приоритет TIME_CRITICAL, который только и делает, что пишет в произвольное место выделенной памяти некоторое количество данных из буфера на стеке, причем граница получателя и источника в общем случае выровненена 1 байт. Средний размер записи - 150-200 байт.
    3. Замеряю скорость... Вот собственно и все.
    Результаты удивили... В этом случае скорость записи колеблется в районе нескольких сотен мегабайт в секунду.
    Переписал тест, начав заполнять выделенную память блоками по 2К, границы выровнены на 16 байт, помогло, но не очень - скорость в районе 1,5ГБ/с. Заполнял счетчиком из переменной в цикле, последовательно, от начала выделенной памяти до конца, тоже самое. отличаетсо не сильно. Короче как я ни старался, увеличить скорость больше 1,7ГБ/с не смог. Пробовал в обход кеша писать, цикл развернул еще немножко увеличилась.

    Короче в растерянности я... читаю сейчас мануал на камни.
    Помогите советом где я лажанулся.
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    The_GorYnycH
    Теоретически 64*667*2=85 376 ГБит/с=10 672 ГБайт/с
    Память в Opteron можно конфигурировать по разному. Можно сделать общуюю или прямой доступ от каждого процессора к совему участку, а к другим он будет идти с меньшей скоростью через другии процессоры.

    Так что тут надо 1 определиться с конфигурацией памяти в биосе настраивается. Но точных параметров не ясно.
    8ГБ неясно прямая привязка к процессору или нет.
    Чувствую вы не понимаете как работает эта подсистема.

    Ты каким способом пишешь/читаешь? Надо через MMX, и про кэш не забываем.
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Pavia
    Вот-вот, в комментариях к тестам это раньше было прописано. И совсем уж давно была возможность померять "реальную" скорость(на простых командах). Тогда они различались в 2 раза, иногда меньше.
    Сейчас скорость команд MMX еще выше(шину все шире делают), поэтому реальную скорость никто и не дает :-( Кстати, пиковую скорость FPU тоже по SSE2 меряют, делают за один такт 4 сложения или умножения. ЖУЛИКИ!!!
     
  4. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    Написал же, что выделяю память на узле... и на нем же запускаю поток... все привязано и память выделена на УЗЛЕ.читайте внимательней.
    Пробовали через memcpy, потом пользовали intrinsic - операторы. все равно скорость маленькая. Выравнивали на кеш-линию. Осуществляли предвыборку... все то же.

    Забыл добавить - выделяемая память лочится, смотрел счетчики - ошибок страниц крайне мало. Скорость - 1ГБ/с при копировании памяти блоком размера 1ГБ(блоки выделены на одном и том же узле) и около 2 при их установке функцией memset или в цикле. Цикл развернут - результат чуть лучше.
     
  5. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    Да, еще нашел тут на сайте статейку: http://www.wasm.ru/baixado.php?mode=doc&id=39 ну и скомпилил и потестил пример, где достигается максимальная производительность. Вопросов нет, по сравнению с memcpy прирост есть, но не настолько большой, как заявлено. Кто-нибудь своими руками тестировал пропускную способность памяти, или все обчитались умных книжек и цитируют аффтаров???
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Тебе самому бы не помешало для начала "умных книжек" почитать, чтобы не путать понятия пропускной способности, латентности доступа и скорости копирования. Повторю в 3-й раз, что при копировании передается не один поток данных, а 3 (при обычной записи) или 2 (при некэшируемой), т.е. скорость копирования в принципе не может быть выше 1/3 или 1/2 от пропускной способности (bandwidth), а реально заметно хуже, т.к. эти потоки еще и мешают друг другу.

    Я тебе в предыдущей теме пытался пример привести, но у тебя же семь пятниц на неделе ;)
    У меня на P4 FSB 800, dual DDR 400 чистая некэшируемая запись (8 выравненных movntq в цикле) дает те же цифры, что и Сандра (~4.2Гb/c), копирование с block-prefetch и некэшируемой записью вдвое меньше (~1.9Гб/с), а обычные кэшируемые методы (movq, movsd\stosd) почти в 3-3.8 раза хуже (~1.1-1.5Гб/с). Ес-но теоретическая пропускная способность в 400*8*2=6.2Гб/с не достигается, ну и хрен с ней - это же P4, а не супер-атлон со встроенным контроллером памяти ;)

    Разумеется эти цифры относятся к последовательной записи\копированию больших блоков данных, размер которых превышает кэш L2. А при записи малых блоков размером в 150-200 байт, да еще по случайным (произвольным) адресам - вообще ловить нечего, т.к. тут рулит не пропускная способность (максимальная скорость передачи), а латентность доступа к памяти. Тебе термины "тайминги", "CL = CAS latency", "tRCD = RAS-to-CAS delay", "tRP = Row precharge" и т.п. о чем нибудь говорят ? Тайминги своей DDR2 смотрел или только "заветные" 667МГц заворожили ? Вопрос в общем-то риторический, т.к. как ни крути, а все навороты в DDR\DDR2 направлены в основном на увеличение именно скорости передачи в пакетном режиме, а латентность случайного доступа оставляет желать лучшего (и кстати "крутые" DDR2 могут иметь худшую латентность по сравнению с "доброй старушкой" DDR 400). Если бы не большая латентность памяти, то и кэши в процессоре нафиг не нужны были бы. Проверь, сколько времени уходит на загрузку одного дворда из памяти - получишь сотню-другую тактов. При последовательном доступе к памяти большая часть этой латентности не проявляется (скрывается): во-первых, строка памяти дольше остается открытой и вклад RAS\RP в латентность существенно снижается; во-вторых, рулит хардварный префетч и передача новых запросов и установка CAS выполняются параллельно с передачей предыдущей порции данных. Но уже при простом кэшируемом копировании больших блоков эта "идилия" нарушается, т.к. требуется читать два потока данных по разным адресам и записывать данные обратно (запись идет с задержкой относительно чтения, поэтому в итоге идет обращение к 3-м разным строкам памяти). При случайном доступе и работе с малыми блоками ситуация еще более ухудшается, т.к. хардварный префетч отдыхает и запросы не могут передаваться с упреждением, строки памяти постоянно открываются\закрываются и т.д.и т.п., т.е. пропускная способность отдыхает, а латентность доступа проявляется во всей своей красе :)
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Более подробно можно почитать в книге КК про оптимизацию.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Вот к примеру статейка с краткой теорией и результатми тестирования DDR и DDR2 на проп.способность и латентность при последовательном и случайном доступе
     
  9. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    The_GorYnycH
    попробуй сделать тоже самое но в ядре и при закрытых прерываниях.
     
  10. The_GorYnycH

    The_GorYnycH New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2008
    Сообщения:
    32
    Всем большое спасибо за помощь и советы!