просьба перечислить возможные варианты записи в память и чтения (с подробным обьяснением) - для нахождения самого быстрого...
откуда писать то в память? скорость выполнения всех команд процессора есть вроде в таблицах по этой теме, а сама память работает с разной скоростью, в зависимости от собсвенной частоты и частоты системной шины. да и часто стоит препочесть кэш памяти. А вообще способ как я понимаю один - процессор должен получить разрешение на начало транзакции он чипсета матплаты, передать на планку адрес а зател саму информацию(или получить её), все что пишется от внешних устройств вроде как попадает через порты, т.е. тоже с помошью процессора. И какой тут способ будет наибыстрейшим?
locki Возможные варианты с подробными объяснениями ? Круто К.Касперски на эту тему целую книгу написал с графиками и картиночками, да и в манулах от интел и амд не хило по этому поводу понаписано. А ты хочешь чтоб тут тебе на блюдечке в двух словах, да еще подробно, да еще и для разных задач. Молодец CrazyFun > "И какой тут способ будет наибыстрейшим?" Зависит от задачи. Например, у всех современных процев кэш работает в режиме line allocate on write miss, т.е. если ты пишешь в память, а данной строки еще нет в кэше, то процессор ее сначала загрузит из памяти, потом запишет в нее новые данные и затем выгрузит обратно в память. Спрашивается нафига ее загружать, если мы хотим записать большой массив данных, который затрет все что там было до этого и больше нам не понадобится (излюбленный пример в манулах это заполнение видеобуфера). Поэтому, чтобы не гонять данные по шине туда и обратно используются non-temporal выгрузки, минуя кэш (movntq и т.п.). Ну и т.д. и т.п. Читайте букварь от Kaspersky PS: Камешек в сторону модераторов Похоже при чистке под ножик попала тема с последней версией memcopy by S_T_A_S_ cо сравнительными данными по копированию больших блоков памяти разными методами. А жаль.. (риторика
leo Это уже который камушек, а ответ на предыдущий не принял к сведению: говорил же, что грохнули всю базу без разбору (до августа прошлого года), поэтому используйте оффлайн.
IceStudent Да шучу я, ес-но.. Вот только бегинеров послать некуда, и в FAQ бОльшая часть ссылок не рабочая, к сожалению. Ладно, молчу
Пример народ есть massiv: array of int64 Код: [] нужно сделать быстрее скорость чтения!!!!!! Daemon: Locki найди спецификации с описанием комманд Ext. 3DNow и SSE и обрати внимание на команды PREFETCH, PREFETCHNTA и т.д.
locki Продолжаешь издеваться ? Правила форума почитай: размер приводимого кода не должен превышать ~20 строк и оформляться тегом code. А ты что понаписал - 128 однотипных строчек, вместо того чтобы многоточие поставить и "и т.д. до 128". Исправь, пока ммодераторы не спохватились и не удалили эту тему вообще Теперь по делу. О каких двух гигах идет речь, если until i=2097152, умножаем на 8 и получаем 16 мегабайт. Правильно ? И задачу уточни - то "сделать быстрее скорость чтения", то "проверяла бы скорость памяти на любой машине" - две разные вещи
Если нужно оценить максимальную скорость чтения из памяти, то незачем читать все подряд, т.к. обмен между ОЗУ и процессором идет кэш-линейками, а это 32, 64 или 128 байт. Если тебе нужно на любой машине кроме реликтовых ископаемых , то достаточно читать по одному дворду через каждые 32 байта. И ес-но сделать обычный цикл без всякого разворота (или с разворотом максимум на 4), т.к. жалкие пара тиков на переход будут выполняться в фоне во время ожидания подгрузки данных из памяти. На пасквиле это может выглядеть примерно так: Код (Text): function ReadMemTest(Buf:pChar;BufSize,RepCount:integer):integer; [b]stdcall[/b]; asm push 0 call Sleep call GetTickCount push ebx push edi push eax mov ebx,Buf mov edx,BufSize mov ecx,RepCount @@rep: xor eax,eax @@read: mov edi,[ebx+eax] add eax,32 cmp eax,edx jb @@read dec ecx jnz @@rep call GetTickCount pop edx pop edi pop ebx sub eax,edx end; var t:integer; S:string; begin t:=ReadMemTest(Buf,BufSize,RepCount); S:=FormatFloat('0.000',BufSize*RepCount*1000/(1024*1024*t))+' Mb/s'; ... end;
компилиться нормально ,но при запуске ругается на строку Код (Text): mov edi,[ebx+eax] да и еще Bufsize-эторзмер буфера для п4 нужно установить 128байт, но я не понял что такое - Buf И чему оно должно быть равно.
Ругаться может если Buf неверный Buf - это указатель на память BufSize - это соответственно размер этой памяти. Размер нужно брать в несколько раз больше размера кэша L2. В принципе твои первоначальные 16Mb подходят. Код (Text): Выделяешь память так: const BufSize = 16*1024*1024; Buf:=VirtualAlloc(Nil,BufSize,MEM_COMMIT,PAGE_READWRITE); в конце экспериментов овобождаешь VirtualFree(Buf,BufSize,MEM_DECOMMIT); VirtualFree(Buf,0,MEM_RELEASE); PS: если BufSize и RepCount объявлены как const, то компилер может ругнуться на слишком большое число BufSize*RepCount*1000 тогда нужно записать так BufSize*(RepCount*1000.0) PPS: перед основным вызовом ReadMemTest можно добавить один холостой проход ReadMemTest с RepCount = 1. При этом результаты получаются стабильнее, т.к. при первом вызове память под Buf м.б. не инициализирована и винда периодически вклинивается, чтобы инициализировать каждую 4Kb страницу.
cresta Нет, я имел ввиду копирование блоков памяти - сравнение методов ALU\GPR, movsd, mmx и optimized mmx. Помнится это было во времена жарких дискуссий с Kaspersky. Да у меня сохранилась и программа и результаты тестирования - просто хотел ссылку дать, а не постить заново без особой надобности