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

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

  1. galileopro

    galileopro Олег

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

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Может кому пригодится, ссылка на книжку http://depositfiles.com/ru/files/es0puc870
     
  3. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    В общем, ждем лео )))
     
  4. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Синтаксис
    Код (Text):
    1. PREFETCH byte ptr [eax]
    только не пойму как уровень то указать?
    Но предвыборку оно будет делать все равно из ОЗУ, но выкрутится можно. Можно в ходе алгоритма потихоньку запихивать в ОЗУ данные, которые потом нужно выполнить, а затем для всех них сделать PREFETCH.
    Ну, допустим, сразу пару Кб сгенерировать и выполнить.
     
  5. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Вообщем в книге Зубкова "Ассемблер для ДОС, Windows и Unix" я нашел главу про кеширование данных :) Там есть около 10 команд для управления кешем, меня заинтересвали 4:
    PREFETCHT0 <Pointer32> перенести данные в L1
    PREFETCHT1 <Pointer32> L2
    PREFETCHT2 <Pointer32> L3
    PREFETCHTNTA <Pointer32> NTA
    Pointer32 - 32 битный укзатель на строку данных.
    Размер данных может отличаться, но не должен быть меньше 32 байт и больше размера кэша.
    Выходит без обращения к ОЗУ все равно этот маш. код не записать в кэш. Возможен еще вариант не записывать что-то в кэш, а поменять что-то в кэше без обращения к ОЗУ. Но такого рода команд я пока не нашел.
     
  6. leo

    leo Active Member

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

    galileopro Олег

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

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    Так я же передаю управление именно на ОЗУ? Там же выделается память в Heap потом идет call p - адрес в Heap. Оно потом эти команды из Heap будет кещировать. Так?
    Или оно до этого уже будет сам этот массив байт в кэше держать?
     
  9. galileopro

    galileopro Олег

    Публикаций:
    0
    Регистрация:
    13 мар 2010
    Сообщения:
    36
    Адрес:
    Питер
    А все понял. То есть по умолчанию этот мой массивчик будет в кэше и call пойдет в кэш. Круто. СПАСИБО!!!
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    По умолчанию вся основная память является кэшируемой с обратной записью (WB - write back) и только для специальных областей памяти (типа видеобуфера, DMA и т.п.) могут устанавливаться атрибуты NC (not cashed) или WT (write throw - кэшируемая со сквозной записью). При этом предполагается, что обращение к основной WB-памяти осущ-ся всегда через процессор и соотв-но он сам решает, где в данный момент находятся актуальные данные - в кэше или в ОЗУ. Соотв-но при любом обращении к WB-памяти, процессор ищет данные по цепочке L1-L2-(L3)-ОЗУ. И обычная (не movnt) запись данных также осущ-ся по этой цепочке, и соотв-но они сначала оказываются в кэше и только когда-то потом могут быть сброшены в ОЗУ (когда будут вытеснены из кэша другими данными или по спец.команде WBINVD).