CPU cache

Тема в разделе "WASM.ASSEMBLER", создана пользователем unicomo, 16 июн 2005.

  1. unicomo

    unicomo New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2004
    Сообщения:
    9
    народ, хочу почитать про кеш проца... точнее про работу с ним и оптимизацию под него... А то на новых камнях он уже больше мега, а нафиг оно надо не совсем понятно...Знаю только о том, что кое что там хранит сам проц...

    и еще о поточнее о разных уровнях кеша (L1-L3)
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    hw_cach.pdf (К.Касперски)

    agner_fog.chm, pentopt.pdf (А.Фог)

    AMD_block_prefetch_paper.pdf
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Block_prefect.

    Я заметил что его можно немного оптимизировать, если считывать сразу две линейки. Не смотря на известный пенальти в целом почему то получается быстрее:
    Код (Text):
    1.  
    2.  ;; sequential reads 2 cacheline
    3.  test        ebx, [esi + ecx + 00h]
    4.  test        ebx, [esi + ecx + 40h]
    5.  ;; or line-spit reading
    6.  test        ebx, [esi + ecx + 3Eh] ;; load 2 cacheline
    7.  


    Проверялось на iCel@2400 и AMD AthlonXP 2000+, не знаю как будет работать на более старых машинах.
     
  4. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    alpet На PIII(celeron L1-16Кб,L2-128Кб, линия 32 байта) при "sequential reads 2 cacheline" заполнение всего L1 можно сделать за ~500 тактов, а при "or line-spit reading" уходит ~2500, как видишь пенальти огромное
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    bogrus

    вот-вот. На Атлоне ХР2000+ (VIA KT400, Kingston 512DDR400), при условии DC Miss, от 380 до 1000 тиков загрузка одной 64 байтной линейки, и порядка 740 - 1000 две сразу. По крайней мере такие результаты дает пайп-тест CodeAnalyst. У твоего Селерона весь L1 кэш 16Кб или только данных? У меня и DC и IC по 64кб на Атлоне и 8Кб / 12Kuops на Селероне.



    И еще - если при случае 2500 тиков страница не пересекается, то какое значение при пересечении границы страницы.
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    У меня и DC и IC по 16Кб, а причем страницы, зачем тебе измерять время загрузки страниц с винта или оперативы в L2? Такой результат у всех будет разный из-за особеностей контролеров, железа, памяти, менеджера памяти, я измерял время выполнения кода (перекачки данных из L2 в L1), вот попробуй такой тест для твоего атлона

    [​IMG] _2115644437__test.zip
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    На Атлоне только дома смогу. Сейчас провери на iCel@2400.

    cacheline1.exe:

    000000000000000000319448

    000000000000000000005744

    000000000000000000002176

    000000000000000000002152

    000000000000000000002188

    000000000000000000002172

    000000000000000000002236

    000000000000000000002132

    000000000000000000002216

    000000000000000000002204



    cacheline2.exe:

    ---------------------------

    00411490 / 12 bytes / 10 passes

    ---------------------------

    000000000000000000320976

    000000000000000000021824

    000000000000000000020972

    000000000000000000020944

    000000000000000000020972

    000000000000000000020976

    000000000000000000020972

    000000000000000000020972

    000000000000000000020972

    000000000000000000020972



    Меня более всего интересует производительность цикла block prefetch. В аттаче мой варинан со сплиттингом, показывает правда результаты в мб/сек. На Celeron соответственно только чтение (Block Prefetch) ~2000 мб/сек, и чтение с доступом к кажому DWORDу ~1512 мб/сек.







    [​IMG] 832991992__mread.zip
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Для своего селерона надеюсь ты поменял size на 1024*8 (L1 - 8 Кб), вот результат твоего теста
    Код (Text):
    1. CPU GenuineIntel @ 669 MHz
    2. Test results:
    3.  
    4. read method read speed
    5.         (64,0 Mb)
    6.  
    7. scaner test 81 MiB/sec
    8. only prefetch   359 MiB/sec
    9. prefetch and read   94 MiB/sec
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    1. Нет, забыл. Вот с 8кбайтным тестом:

    cacheline1.exe:

    ---------------------------

    00403490 / 15 bytes / 10 passes

    ---------------------------

    000000000000000000038840

    000000000000000000000280

    000000000000000000000176

    000000000000000000000156

    000000000000000000000156

    000000000000000000000156

    000000000000000000000156

    000000000000000000000160

    000000000000000000000160

    000000000000000000000160

    cacheline2.exe:

    ---------------------------

    00403490 / 12 bytes / 10 passes

    ---------------------------

    000000000000000000034584

    000000000000000000001912

    000000000000000000001240

    000000000000000000001240

    000000000000000000001240

    000000000000000000001240

    000000000000000000001240

    000000000000000000001352

    000000000000000000001352

    000000000000000000001352



    В аттаче тот же тест, только с обычным чтением. На Селероне4 результаты практически не изменились - 1994 / 1505 мб/сек. Впрочем похоже здесь аппаратный префетч работает - если убрать цикл block prefetch скорость 3 алгоритма достигает 1560мб/сек.

    [​IMG] _1412657976__mread2.zip
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А размер линии какой? Если 32 то тоже надо поменять:
    Код (Text):
    1. ;================обычн=============================необычн============
    2. @@:      mov    eax,[esi+ebp]      @@:      mov    eax,[esi+ebp+32-2]
    3.          mov    eax,[esi+ebp+32]            add    ebp,32*2
    4.          add    ebp,32*2                    jnz    @b
    5.          jnz    @b
    6. ;=====================================================================
    Обычный получше
    Код (Text):
    1. CPU GenuineIntel @ 669 MHz
    2. Test results:
    3.  
    4. read method read speed
    5.         (64,0 Mb)
    6.  
    7. scaner test 83 MiB/sec
    8. only prefetch   632 MiB/sec
    9. prefetch and read   155 MiB/sec
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Линейка 64 у L1DC, и 128 у L2. А сколько у тебя вообще memory-bandwidth?
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Около 145Mb/s (копирование), та у меня вообще частота шины 66MHz, два SDRAM PC100, нормальный средний комп :)



    Я сам то твой тест не посмотрел, там проставил свои параметры (CACHELINE = 32, CHESIZE = 1024*16), но результат странный, кажется там половину кода надо подганять?
    Код (Text):
    1. ;=обычн==========================сплит=============================
    2. CPU GenuineIntel   @ 669 MHz    CPU GenuineIntel   @ 669 MHz
    3. Test results:                   Test results:
    4.  
    5. read method       read speed    read method       read speed
    6.                     (64,0 Mb)                       (64,0 Mb)
    7.  
    8. scaner test        83 MiB/sec   scaner test        81 MiB/sec
    9. only prefetch     632 MiB/sec   only prefetch     358 MiB/sec
    10. prefetch and read 275 MiB/sec   prefetch and read 156 MiB/sec
    11. ;===================================================================
     
  13. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Интересный результат - когда я на iCel@2400 запустил тест работающий с 32 байтными линейками, но обогнал тот что работает с 64-байтными по времени выполнения:

    <32byteline /8kb cache>
    Код (Text):
    1.  
    2. CPU GenuineIntel @ 2405 MHz
    3. ...
    4. scaner test 539 MiB/sec
    5. only prefetch   2024 MiB/sec
    6. prefetch and read   1542 MiB/sec
    7.  


    против

    <64byteline/8kb cache>
    Код (Text):
    1.  
    2. scaner test 543 MiB/sec
    3. only prefetch   1976 MiB/sec
    4. prefetch and read   1514 MiB/sec
    5.  


    Предположительно виновником затормаживания второго теста, является время от времени возникающий конфликт банков. Это показывает плохое влияние сильно развернутых циклов на производительность префетч блока. В качестве примера нейтрализации подобного конфликта, можно попытаться заставить процессор читать дважды, вот код куска цикла который выполняется с CACHELINE=64:
    Код (Text):
    1.  
    2.                 repeat (400h / CACHELINE)
    3.                  test                   eax, [ecx + ebx + n]
    4.                  test                   eax, [ecx + ebx + n] ;; use Ls queue,
    5.                  n = n + CACHELINE
    6.                 end repeat
    7.  
    8.  


    В данном случае он выполняется с производительностью 2029mb/s, против 1885mb/sec с 32-байтными линейками. Кстати сама скорость - 2030мб/сек превысила выданный RMA прогноз read memory-bandwidth в 2020мб/сек.



    В аттаче сам тест слегка поправленный на макросы.

    [​IMG] 602336230__mread2.zip
     
  14. MoKC0DeR

    MoKC0DeR New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2003
    Сообщения:
    136
    Адрес:
    Russia
    CPU AuthenticAMD @ 2010 MHz

    Test results:



    read method read speed

    (64,0 Mb)



    scaner test 1065 MiB/sec

    only prefetch 5226 MiB/sec

    prefetch and read 3280 MiB/sec
     
  15. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    MoKC0DeR

    Ты не поправлял в тесте CACHELINE=32, на 64? А то уж больно большой разрыв получается, для AMD64. С другой стороны - комманды могут максимум париться в используемом блоке чтения по 2-3 штуки, и для 2010Мгц частоты ядра получается вполне нормальный результат.
     
  16. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Вот сравнительные тесты на моем домашнем компе:

    CPU AuthenticAMD @ 1661 MHz

    Test results:



    read method read speed

    (64,0 Mb)



    scaner test 827 MiB/sec

    only prefetch 1693 MiB/sec

    prefetch and read 1462 MiB/sec



    cacheline1.exe:

    000000000000000000024806

    000000000000000000000175

    000000000000000000000174

    000000000000000000000174

    000000000000000000000138

    000000000000000000000138

    000000000000000000000138

    000000000000000000000138

    000000000000000000000138

    000000000000000000000138

    cacheline2.exe:

    000000000000000000023194

    000000000000000000000468

    000000000000000000000182

    000000000000000000000161

    000000000000000000000137

    000000000000000000000137

    000000000000000000000137

    000000000000000000000137

    000000000000000000000137

    000000000000000000000137
     
  17. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Получается на атлоне нет таких пенальти, тогда есть смысл попробовать для него ускорить код, т.е. например на PIII цикл выполняется минимум 2 такта и за 2 такта можно сделать два чтения, по-этому цикл с одним чтением не рационально использует этот блок



    надо: замерить на атлоне 1000 проходов пустого цикла
    Код (Text):
    1. @@:          dec    ebp
    2.              jnz    @b
    Если результат будет ~2000, значит 2 такта на цикл, потом в цикл добавлять чтения пока не выйдем за рамки ~2000
    Код (Text):
    1. @@:          mov    eax,[esi+ebp+32-2]
    2.              mov    eax,[esi+ebp+32*3-2]
    3.              add    ebp,32*4
    4.              jnz    @b
     
  18. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    bogrus

    Вообще с моим Атлоном все гораздо проще, могу сделать скриншот эмулятора конвеера показывающий все затраты на организацию цикла по тикам. Хотя если честно блок-преФетч циклы в нем выглядят очень неудобно - слишком длинные линейки эксплуатации каждого конвейера получаются из-за вывода пенальти DC-Miss (в ряде случаев до 1000 тиков). Накрайняк могу представить DPI (delta per instruction) для предложенного кода, это в общем случае соответствует количеству тиков.
     
  19. unicomo

    unicomo New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2004
    Сообщения:
    9
    народ, насчет теста: есть некий алгоритм, я хочу его прогнать например 0xFFFF раз =) и узнать время его выполнения, это реально? как вообще толком отследить, сколько выполняется та или иная часть кода
     
  20. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    unicomo тест (масм\фасм) в аттаче, все реально - разбирайся

    [​IMG] 2044615784__wintest.zip