Есть задача: нужно поместить в кеш процессора набор команд (машинные кода их для защищенного режима i486) и передать на них управление call - ом (последней командой должна быть ret). Вот так я это сделал в ОЗУ (поместил команды в ОЗУ и передал на них управление), а как это сделать в кеше? И, кстати, извинить, что код на Delphi, там в асмовской вставке. И примеры, если будут, то можно на асме, но с оговоркой: заработает ли это во вставке (например в С++ или Delphi) или нет. Просто полностью все приложение переписывать на асме я не успею, нужно во вставке попытаться. Кстати еще бы не мешало про оптимизацию этого кода поговорить: как занести это в кеш так, чтобы оно выполнилось максимально быстро и само копирование производить максимально быстро. И еще неплохо бы узнать как запустить эти копирования и выполнения 100000000 раз и засечь время ОЧЕНЬ точно (rdtstl - количество тиков померять или QuertyPerfomanceCounter()) Code (Text): var h:Cardinal; p,p2:Pointer; i:integer; begin h := GetProcessHeap(); p:=HeapAlloc(h,0,5); i:=3; p2:=@i; asm mov ecx, p mov al, 67h mov ah, 66h mov bl, 89h mov [ecx], al mov [ecx+1], ah mov [ecx+2], bl mov al, 18h mov ah, 195d mov [ecx+3], al mov [ecx+4], ah mov ebx, 5656 mov eax, p2 call ecx end; Form1.Caption:=IntToStr(i);
Код немного исправил. Вот рабочий пример. Code (Text): procedure TForm1.Button1Click(Sender: TObject); var h:Cardinal; p,rez:Pointer; i,j:integer; begin h := GetProcessHeap(); p:=HeapAlloc(h,0,3); i:=656; rez:=@i; asm mov ecx, p mov ax, 49923d //(03 C3) add eax, ebx mov [ecx], ax mov bl, 195d //(C3) ret mov [ecx+2], bl mov eax, 1 mov ebx, 1 end; for j:=1 to 4000000 do begin asm call p mov i, eax end; end; Form1.Caption:=IntToStr(i); end; Это с ОЗУ. То есть ЦП загрузит из ОЗУ к себе в кеш и выполнит. А хотелось бы сразу выполнять.
Интересует конкретно список команд для работы с разными уровнями кеша процессоров семейства i486 (AMD, Intel). Любая литература по этой теме, статьи. Ну и пример не помешает. Заранее спасибо.
galileopro Жжжесть, которая явно должна быть здесь. Про работу кеш в i486 см. аттач. Никакой "ручной загрузки" в кеш не было тогда, нет и сейчас - ты всегда помещаешь в память, а процессор уже сам решает когда это иметь или не иметь в кеше.
А как можно ускорить приведенный выше код? Как мне "выровнять" кешируемые данные, чтобы не было задержек?
Y_Mur, чем этот файл открывать? WinRAR, Adobe Reader. Я скачал архив и там 3 файла все имеют расширение .rus. Я такого не использовал никогда
А в кеш L3 закинуть это тоже нельзя? Чтобы ЦП подгружал к себе в L1 кэш из него, а не из ОЗУ? Просто скорость тут критична. Я так думаю, если уже ничего не выйдет, прийдется SSE или MMX пробовать(
Любым текстовым редактором, поддерживаеющим дос кодировку, можешь нортон коммандером, можешь вордом, рекомендую бред. ЗЫ: нда какой тебе асм, если простой текст в дос кодировке прочесть не можешь...
И еще, может совсем тупой вопрос, но я новичок, так что не бейте сильно Можно ли засунуть этот машинный код в стек командами push а затем передать управление на вершину стека? Это будет быстрее, чем в ОЗУ?
Y_Mur, я понял уже. Просто расширение с толку сбивает. MS Word распознает кодировку DOS. Я им открыл. Спасибо.
medstrax1 Дык он хочет вручную сразу в кеш - минуя память Гы-Гы тут PREFETCHTx не поможет galileopro SSE или MMX на i486 - мегакруто - если получится - отпиши результат )