В соответствии с Справочным руководством по оптимизации архитектуры Intel® 64 и IA-32, раздел B.4 ( "Методики настройки производительности для Intel архитектуры Microarchitecture Code Name Sandy Bridge" ), подраздел B.4.5.2 ( "Помощь" ):
32-байтные инструкции хранения AVX, которые охватывают две страницы, требуют помощи, которая стоит примерно 150 циклов.
Я использую регистры YMM для копирования небольших блоков фиксированного размера, от 32 до 128 байтов, а блоки выравниваются на 16 байтов в кучевом менеджере. Этот менеджер кучи использовал XMM-регистры до movdqa
, и я хотел бы "обновить" его до YMM без изменения выравнивания от 16 до 32 байтов. Поэтому я использую vmovdqu ymm0, ymmword ptr [rcx]
, затем vmovdqu ymmword ptr [rdx], ymm0
и т.д.
Если я правильно понял документ Intel о размере страницы, если я сделаю 32-байтовый магазин на границе 4K-страницы, я получу штраф в 150 циклов.
Но поскольку блоки уже выровнены на 16 байтов, вероятность того, что я попал в хранилище между страницами, равен 16/4096 = 1/256. Если мы статистически экстраполируем это, то в каждом 32-байтовом магазине я получаю 1/256 * 150 (= 0,5859375) штрафных циклов на Sandy Bridge.
Это не так много и определенно дешевле, чем разветвление, чтобы проверить выравнивание или потеря памяти из-за изменения выравнивания от 16 до 32 байтов.
У меня есть следующие вопросы:
-
Правильно ли мои вычисления?
-
Совместимы ли хранилища памяти AVX-256, которые нужно беспокоиться о небольших плагинах памяти с фиксированным размером (32-128 байт), учитывая, что шансы нанести штраф настолько низки?
-
Существуют ли процессоры с более высоким неуравновешенным 32-байтным штрафом за магазин, чем Sandy Bridge, например, AMD или другие микроархитектуры Intel?