Понятия "КЭШ-Промах" и "КЭШ-попадание" ?

Тема в разделе "WASM.BEGINNERS", создана пользователем EvilsInterrupt, 5 сен 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Рассуждение:
    Как я понял, КЭШ имеет 256Кб, а одна его строка 32 байт, отсюда 256КБ / 32 Б= 8 КБ штук строк! :) Так?
    Память делится на n кусков размеров в КЭШ, т.е на 256КБ блоки(все это уссловно) - страницы Так?

    КЭШ с прямым отображением содержит строки в которых есть:
    1. Номер строки в странице
    2. Номер страницы в памяти - ТЭГ
    3. Номер байта в строке
    4. Признаки

    Все верно?

    Я только начал читать, но не понимаю:
    1. Что такое Кэш-промах
    2. Если произошел КЭШ-промах, что произойдет?
    3. Допустим только компьютер только включил, КЭШ толкько только использоваться начал, произошло обращение к памяти, контроллер КЭШа записал ТЭГ, номерстроки, признаки выставил, когда произойдет запись в КЭШ?
    4. Допустим при обращении к памяти, есть такая страница в КЭШе, есть такая же строка, такой ТЭГ, по признакам она уже ранее была использована, но фактически содержание памяти и КЭШа различны, как такая ситуация разруливается?

    буду рад, кто сможет объяснить
     
  2. Ole

    Ole Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    69
    Сто лет назад читал насчет кэш-промахов, понял так: ты наверное заметил, что при первом запуске какой-либо процедуры, она выполняется медленнее чем при повторных. Идет заполнение кэша. Далее - если в процедуре присутствует код изменяющий данные перед собой, возникнет ситуация кэш-промаха. Например:
    ---...---
    mov [label+1],0
    ---...---
    label1:
    mov eax,123456
    конвеер работает на опережение, но данный код, скорее всего поставит его в тупик, и будет промах.
    Х.З. Может и не так
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    EvilsInterrupt
    В разных процессорах по разному, ес-но

    Нет не так ;) Кеши с прямым отображением рассматриваются в книжках просто ради примера, а в современных компах все кеши - множественно-ассоциативные, поэтому говорить о каких-то блоках-страницах смысла не имеет.
    Никакого номера строки и номера байта в строке в явном виде ес-но нет - это просто способ многоуровневой адресации кеша. Возьмем твой пример: размер кеша 256К, размер строки 32, пусть ассоциативность = 8-way. Это означает, что 256К/32 = 8К строк объединяются в наборы по 8 штук, образуя 1К=1024 набора по 8 строк. Как происходит обращение к такому кэшу ? Если задействована страничная трансляция, то сначала линейный адрес преобразуется в физический с помощью TLB. Затем адрес разбивается на поля (просто проводочки разветвляются на разные мультиплексоры :) - младшие 5 бит определяют номер байта в строке (2^5 = 32), следующие 10 бит определяют номер набора (2^10=1К), а остальные старшие биты являются тегом, по которому осуществляется выбор одной из 8 строк в наборе. В результате сравнивнения этих бит с тегами всех 8 строк набора возможны разные ситуации. Если тег найден и строка помечена как валидная, то имеем кеш-попадание (хит) и можно производить чтение или запись в строку. А если тег не найден или найден, но строка помечена как инвалидная, то получаем кеш-промах (мисс), т.е. нужной строки в данном кеше нет и требуется обращение к памяти следующего уровня (из L1 к L2, из L2 к L3 или к ОЗУ). Причем в нормальном дефолтном WB-режиме не только промах на чтение, но и на запись вызывает загрузку строки из ОЗУ - это называется write allocate или read for ownership. Этот механизм дешево и сердито обеспечивает синхронизацию данных в кеше и ОЗУ для обычных кешируемых чтений\записей (чуть подробнее см.Немного вопросов про кэш.). Ну а для всяких direct I/O, DMA, MP и т.п. существуют свои возможности и правила обеспечения когерентности - см.IA-32 v.3A (memory cache control) + v.1 (cacheability control instructions и т.п.). Так что на уровне системы бесконфликтность должна поддерживаться, а если ты в своей проге ошибок наделаешь (например, начнешь читать данные после movntX, забыв про mfence) - это уж твои проблемы и разруливать тут никто ничего не будет, т.к. и механизмов таких нема ;) Обмен кеш-ОЗУ всегда осуществляется целыми линейками, поэтому "правильные" данные могут быть либо в кеше, либо в ОЗУ (ну или ни там ни сям - в "подвешенном состоянии" в процессе передачи или в буферах записи)