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

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

  1. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Вау, сори, где-то пропустил эту мегамысль
     
  2. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Y_Mur, ну не на i486 понятно:) На нормальном Athlon X2 215 будем пробовать)
    А скопировать это "насильно" из ОЗУ в L3 кэш? Просто вот какая штука, если напрямую из ОЗУ его вызывать, то для 100000000 вызовов получается 4.8 секунды выполнение, а должно быть секунду(
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    galileopro
    стек тоже находится в ОЗУ ;) Кроме того современные оси могут тебе это не позволить сделать (впрочем если ты и в самом деле на i486 это не важно). Но быстрее точно не будет.
    В любом случа самомодифицирующийся/самосоздающийся код тормоз - хочешь скорости не копируй исполняемый код непосредственно перед исполнением, а используй готовый из под компилятора.
     
  4. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    medstrax1, там на самом деле нужно реализовать ОПЗ с высокой скоростью вычислений. Я сначала реализую прямой ход польской записи, затем стековые вычисления перевожу в машинный код. Хотелось бы эти вычисления сделать на обычном стеке. Не знаю будет ли это быстрее или нет. Тем более размер стека ограничен сильно. А вот L3 кэш - это все таки 8 метров. Туда можно бы скопировать.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    galileopro
    Уточню совет medstrax1 - зайди в поиск по форуму (самая верхняя строка этой станицы), в поле "поиск автора" набери leo и наслаждайся техническими деталями кеширования в современых процессорах.
     
  6. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    То есть нужно сгенерировать сразу блок машинных команд побольше (для моего ЦП 64 Кб - размером с L1 кэш) занести его в ОЗУ или в L2, L3 кэш и передать управление, только надо позаботиться, чтобы ЦП скопировал его "в притык" а не 2 порциями. Так?
     
  7. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Кстати, есть еще 2 вариант: сгенерировать отдельную dll с нужным маш. кодом и вызывать оттуда функцию. Только вот быстрее ли это будет? PE Loader ведь все равно будет в ОЗУ её грузить и оттуда вызывать.
     
  8. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Че то не совсем понял идею. ЦП итак закэширует код.
     
  9. galileopro

    galileopro Олег

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

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    medstrax1
    Идея в полном остутствии понимания мат-части - я ему в #25 уже повторил твой совет читать посты leo (и даже разжевал как это сделать) но он продолжает бурно развивать суперфантастику :)
     
  11. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Я обратился уже. Я подожду пока ответит человек. Это же не сразу произойдет. А пока, возможно кто-то все таки можно ли что-то записать в L3-L2 кэш :)
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    galileopro
    Не нужно ждать пока leo распишет грааандиозную статью для ликвидации твоего громааааднейшего пробела в знании матчасти. В поиске набираешь ключевой слоко "кеш", автор leo и аслажаешся результатом http://www.wasm.ru/forum/search.php?search_id=114728921

    ЗЫ: реальность сильно не такая как тебе кажется ;)
     
  13. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В i486 были инструкции/регистры для управления кэшем. Можно было его заполнить явно и отключить кэширование навсегда, оставив кэш таким, какой он был на момент отключения. Однако, это чревато тем, что в кэш перестанут попадать данные выполняющейся программы. После i486, как я понял, регистры/инструкции были закрыты, но если именно 486, то можно попробовать. Больше почтить об этом можно у Григорьева.
     
  14. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    не претендуя на лавры лео, замечу - как только проц начинает выполнение некоего кода,
    этот код УЖЕ закэширован. л1,л2 или л3 здесь не роляет, у интела кэш инклюзивный.
     
  15. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Собственно ничего не изменилось. только рег-ры tr0-7 стали недоступны. А суть кэширования та же. Можно, как и на 486, выполнять код из кэша, при этом в памяти он не будет присутствовать
     
  16. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Mika0x65, Григорьев, а название книги, можно?
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    medstrax1
    Ну, я, вроде, тоже самое и сказал. Замечу еще, что в i486 кэш данных и кэш кода не разделены, это тоже может повлиять, думаю.
     
  18. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Я понимаю, что ЦП начинает выполнять маш. код ТОЛЬКО когда он уже в Кэше. Но весь вопрос в том, как сделать так, чтобы избавиться от КОПИРОВАНИЯ этого маш кода из ОЗУ в его кеш, а НАПРЯМУЮ записать байты этих команд в этот самый кэш.
     
  19. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    galileopro
    Григорьев В. "Микропроцессор i486. Архитектура и программирование". Или "Микропроцессор i486. Программирование и архитектура", точно не помню. Книга состоит из четырех томов, кэш описан в конце первого.
     
  20. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Как я понял максиму на что можно рассчитывать это
    как сказано в статье leo. Но если загружать можно только строку, то она же все равно должна быть в ОЗУ? То есть смысла нет. Хотя 1 символ - это тоже строка. Можно прямо в ходе генерации маш. кода по Польской записи скидывать по 1 символу в КЭШ. А потом передать управление на 1 - й символ этой строки.