возможные варианты записи в память и чтения-нахождение самого быстрого...

Тема в разделе "WASM.BEGINNERS", создана пользователем locki, 1 окт 2005.

  1. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    просьба перечислить возможные варианты записи в память и чтения (с подробным обьяснением) - для нахождения самого быстрого...
     
  2. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    откуда писать то в память?

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

    А вообще способ как я понимаю один - процессор должен получить разрешение на начало транзакции он чипсета матплаты, передать на планку адрес а зател саму информацию(или получить её), все что пишется от внешних устройств вроде как попадает через порты, т.е. тоже с помошью процессора. И какой тут способ будет наибыстрейшим?
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    locki

    Возможные варианты с подробными объяснениями ? Круто ;)

    К.Касперски на эту тему целую книгу написал с графиками и картиночками, да и в манулах от интел и амд не хило по этому поводу понаписано. А ты хочешь чтоб тут тебе на блюдечке в двух словах, да еще подробно, да еще и для разных задач. Молодец ;)



    CrazyFun

    > "И какой тут способ будет наибыстрейшим?"

    Зависит от задачи. Например, у всех современных процев кэш работает в режиме line allocate on write miss, т.е. если ты пишешь в память, а данной строки еще нет в кэше, то процессор ее сначала загрузит из памяти, потом запишет в нее новые данные и затем выгрузит обратно в память. Спрашивается нафига ее загружать, если мы хотим записать большой массив данных, который затрет все что там было до этого и больше нам не понадобится (излюбленный пример в манулах это заполнение видеобуфера). Поэтому, чтобы не гонять данные по шине туда и обратно используются non-temporal выгрузки, минуя кэш (movntq и т.п.). Ну и т.д. и т.п. Читайте букварь от Kaspersky ;)



    PS: Камешек в сторону модераторов ;) Похоже при чистке под ножик попала тема с последней версией memcopy by S_T_A_S_ cо сравнительными данными по копированию больших блоков памяти разными методами. А жаль.. (риторика ;)
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    leo

    Это уже который камушек, а ответ на предыдущий не принял к сведению: говорил же, что грохнули всю базу без разбору (до августа прошлого года), поэтому используйте оффлайн.
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    IceStudent

    Да шучу я, ес-но.. Вот только бегинеров послать некуда, и в FAQ бОльшая часть ссылок не рабочая, к сожалению. Ладно, молчу ;)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    leo

    В оффлайн посылать.. Но это жестоко, конечно - он немаленький.
     
  7. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Пример

    народ есть massiv: array of int64

    Код:



    []



    нужно сделать быстрее скорость чтения!!!!!!





    Daemon: Locki найди спецификации с описанием комманд Ext. 3DNow и SSE и обрати внимание на команды PREFETCH, PREFETCHNTA и т.д.
     
  8. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    Пишу программу которая бы проверяла бы скорость памяти на любой машине и выдавала резуультат
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    locki

    Продолжаешь издеваться ? Правила форума почитай: размер приводимого кода не должен превышать ~20 строк и оформляться тегом code. А ты что понаписал - 128 однотипных строчек, вместо того чтобы многоточие поставить и "и т.д. до 128". Исправь, пока ммодераторы не спохватились и не удалили эту тему вообще



    Теперь по делу. О каких двух гигах идет речь, если until i=2097152, умножаем на 8 и получаем 16 мегабайт. Правильно ?

    И задачу уточни - то "сделать быстрее скорость чтения", то "проверяла бы скорость памяти на любой машине" - две разные вещи
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Если нужно оценить максимальную скорость чтения из памяти, то незачем читать все подряд, т.к. обмен между ОЗУ и процессором идет кэш-линейками, а это 32, 64 или 128 байт. Если тебе нужно на любой машине кроме реликтовых ископаемых ;), то достаточно читать по одному дворду через каждые 32 байта. И ес-но сделать обычный цикл без всякого разворота (или с разворотом максимум на 4), т.к. жалкие пара тиков на переход будут выполняться в фоне во время ожидания подгрузки данных из памяти.

    На пасквиле это может выглядеть примерно так:
    Код (Text):
    1. function ReadMemTest(Buf:pChar;BufSize,RepCount:integer):integer; [b]stdcall[/b];
    2. asm
    3.         push 0
    4.     call Sleep
    5.     call GetTickCount
    6.     push ebx
    7.     push edi
    8.     push eax
    9.     mov ebx,Buf
    10.     mov edx,BufSize
    11.     mov ecx,RepCount
    12. @@rep:
    13.     xor eax,eax
    14. @@read:
    15.     mov edi,[ebx+eax]
    16.     add eax,32
    17.     cmp eax,edx
    18.     jb  @@read
    19.     dec ecx
    20.     jnz @@rep
    21.     call GetTickCount  
    22.     pop edx
    23.     pop edi
    24.     pop ebx
    25.     sub eax,edx
    26. end;
    27. var t:integer; S:string;
    28. begin      
    29.     t:=ReadMemTest(Buf,BufSize,RepCount);
    30.     S:=FormatFloat('0.000',BufSize*RepCount*1000/(1024*1024*t))+' Mb/s';
    31.     ...
    32. end;
     
  11. locki

    locki New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2005
    Сообщения:
    83
    Адрес:
    Russia
    компилиться нормально ,но при запуске ругается на строку
    Код (Text):
    1. mov edi,[ebx+eax]
    2.  


    да и еще Bufsize-эторзмер буфера для п4 нужно установить 128байт, но я не понял что такое - Buf И чему оно должно быть равно.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ругаться может если Buf неверный

    Buf - это указатель на память

    BufSize - это соответственно размер этой памяти. Размер нужно брать в несколько раз больше размера кэша L2. В принципе твои первоначальные 16Mb подходят.
    Код (Text):
    1. Выделяешь память так:
    2.     const BufSize = 16*1024*1024;
    3.     Buf:=VirtualAlloc(Nil,BufSize,MEM_COMMIT,PAGE_READWRITE);
    4. в конце экспериментов овобождаешь
    5.     VirtualFree(Buf,BufSize,MEM_DECOMMIT);
    6.     VirtualFree(Buf,0,MEM_RELEASE);
    PS: если BufSize и RepCount объявлены как const, то компилер может ругнуться на слишком большое число BufSize*RepCount*1000 тогда нужно записать так BufSize*(RepCount*1000.0)



    PPS: перед основным вызовом ReadMemTest можно добавить один холостой проход ReadMemTest с RepCount = 1. При этом результаты получаются стабильнее, т.к. при первом вызове память под Buf м.б. не инициализирована и винда периодически вклинивается, чтобы инициализировать каждую 4Kb страницу.
     
  13. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Часом не про этот файл речь:



    [​IMG] 1843404146__memread2.asm
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta

    Нет, я имел ввиду копирование блоков памяти - сравнение методов ALU\GPR, movsd, mmx и optimized mmx. Помнится это было во времена жарких дискуссий с Kaspersky. Да у меня сохранилась и программа и результаты тестирования - просто хотел ссылку дать, а не постить заново без особой надобности :)