прокешировать и выполнить код

Тема в разделе "WASM.ASSEMBLER", создана пользователем galileopro, 16 май 2010.

  1. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Есть задача: нужно поместить в кеш процессора набор команд (машинные кода их для защищенного режима i486) и передать на них управление call - ом (последней командой должна быть ret). Вот так я это сделал в ОЗУ (поместил команды в ОЗУ и передал на них управление), а как это сделать в кеше? И, кстати, извинить, что код на Delphi, там в асмовской вставке. И примеры, если будут, то можно на асме, но с оговоркой: заработает ли это во вставке (например в С++ или Delphi) или нет. Просто полностью все приложение переписывать на асме я не успею, нужно во вставке попытаться. Кстати еще бы не мешало про оптимизацию этого кода поговорить: как занести это в кеш так, чтобы оно выполнилось максимально быстро и само копирование производить максимально быстро. И еще неплохо бы узнать как запустить эти копирования и выполнения 100000000 раз и засечь время ОЧЕНЬ точно (rdtstl - количество тиков померять или QuertyPerfomanceCounter())
    Код (Text):
    1. var h:Cardinal;
    2. p,p2:Pointer;
    3. i:integer;
    4. begin
    5. h := GetProcessHeap();
    6. p:=HeapAlloc(h,0,5);
    7. i:=3;
    8. p2:=@i;
    9.  asm
    10. mov ecx, p
    11. mov al, 67h
    12. mov ah, 66h
    13. mov bl, 89h
    14. mov [ecx], al
    15. mov [ecx+1], ah
    16. mov [ecx+2], bl
    17. mov al, 18h
    18. mov ah, 195d
    19. mov [ecx+3], al
    20. mov [ecx+4], ah
    21. mov ebx, 5656
    22. mov eax, p2
    23. call ecx
    24.  end;
    25.  Form1.Caption:=IntToStr(i);
     
  2. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Код немного исправил. Вот рабочий пример.
    Код (Text):
    1. procedure TForm1.Button1Click(Sender: TObject);
    2. var h:Cardinal;
    3. p,rez:Pointer;
    4. i,j:integer;
    5. begin
    6. h := GetProcessHeap();
    7. p:=HeapAlloc(h,0,3);
    8. i:=656;
    9. rez:=@i;
    10.  asm
    11. mov ecx, p
    12. mov ax, 49923d //(03 C3) add eax, ebx
    13. mov [ecx], ax
    14. mov bl, 195d //(C3) ret
    15. mov [ecx+2], bl
    16. mov eax, 1
    17. mov ebx, 1
    18. end;
    19. for j:=1 to 4000000 do begin
    20. asm
    21. call p
    22. mov i, eax
    23.  end;
    24.  end;
    25.  Form1.Caption:=IntToStr(i);
    26. end;
    Это с ОЗУ. То есть ЦП загрузит из ОЗУ к себе в кеш и выполнит. А хотелось бы сразу выполнять.
     
  3. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Интересует конкретно список команд для работы с разными уровнями кеша процессоров семейства i486 (AMD, Intel). Любая литература по этой теме, статьи. Ну и пример не помешает. Заранее спасибо.
     
  4. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    prefetch рулит. за подробностями к leo.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    galileopro
    Жжжесть, которая явно должна быть здесь.
    Про работу кеш в i486 см. аттач.
    Никакой "ручной загрузки" в кеш не было тогда, нет и сейчас - ты всегда помещаешь в память, а процессор уже сам решает когда это иметь или не иметь в кеше.
     
  6. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    А как можно ускорить приведенный выше код? Как мне "выровнять" кешируемые данные, чтобы не было задержек?
     
  7. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    И что за расширение у файлов архиве? У меня пишет .rus это что за документы?
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    файл Ap_g3 в аттаче выше
     
  9. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    medstrax1, хотя бы что это такое, чтобы погуглить можно было Вы сможете сказать?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Обычый текст в dos кодировке, можешь в txt перименовать
     
  11. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Y_Mur, чем этот файл открывать? WinRAR, Adobe Reader. Я скачал архив и там 3 файла все имеют расширение .rus. Я такого не использовал никогда:dntknw:
     
  12. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    А понял.
     
  13. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Не совсем так, не забывайте о PREFETCHTx
     
  14. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    А в кеш L3 закинуть это тоже нельзя? Чтобы ЦП подгружал к себе в L1 кэш из него, а не из ОЗУ? Просто скорость тут критична. Я так думаю, если уже ничего не выйдет, прийдется SSE или MMX пробовать(
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Любым текстовым редактором, поддерживаеющим дос кодировку, можешь нортон коммандером, можешь вордом, рекомендую бред.

    ЗЫ: нда какой тебе асм, если простой текст в дос кодировке прочесть не можешь...
     
  16. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    И еще, может совсем тупой вопрос, но я новичок, так что не бейте сильно:) Можно ли засунуть этот машинный код в стек командами push а затем передать управление на вершину стека? Это будет быстрее, чем в ОЗУ?
     
  17. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Гуглить особо нечего. Маны, гл.10, А.Фог, интеловские доки Optimization Reference Manual
     
  18. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Y_Mur, я понял уже. Просто расширение с толку сбивает. MS Word распознает кодировку DOS. Я им открыл. Спасибо.
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    medstrax1
    Дык он хочет вручную сразу в кеш - минуя память :) Гы-Гы :) тут PREFETCHTx не поможет :)

    galileopro
    SSE или MMX на i486 - мегакруто - если получится - отпиши результат :))
     
  20. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Хе-хе. Похоже новичок стебается. Идея выполнения на стеке новичку обычно не по силам