Если ваш ЦП имеет бит CPUID ERMSB, то команды rep movsb
и rep stosb
выполняются иначе, чем на старых процессорах.
См. Справочное руководство по оптимизации, раздел 3.7.6. Расширенная работа REP MOVSB и REP STOSB (ERMSB).
Как руководство, так и мои тесты показывают, что преимущества rep stosb
по сравнению с обычным перемещением 32-битных регистров на 32-битном процессоре микроархитектуры Skylake проявляются только в больших блоках памяти, превышающих 128 байт. На меньших блоках, таких как 5 байтов, код, который вы показали (mov byte [edi],al
; inc edi
; dec ecx
; jnz Clear
), будет намного быстрее, поскольку затраты на запуск rep stosb
очень высоки - около 35 циклов.
Чтобы получить преимущества rep stosb
на новых процессорах с битом CPUID ERMSB, должны быть выполнены следующие условия:
- буфер назначения должен быть выровнен по 16-байтовой границе;
- если длина кратна 64, производительность может быть еще выше;
- бит направления должен быть установлен вперед (установлен инструкцией
cld
).
Согласно руководству по оптимизации Intel, ERMSB начинает превосходить хранилище памяти через обычный регистр на Skylake, когда длина блока памяти составляет не менее 128 байт, потому что, как я писал, в ERMSB высокий внутренний запуск - около 35 циклов. ERMSB начинает явно превосходить другие методы, включая копирование и заполнение AVX, когда длина превышает 2048 байт. Однако это в основном относится к микроархитектуре Skylake и не обязательно относится к другим микроархитектурам ЦП.
На некоторых процессорах, но не на других, когда буфер назначения выровнен по 16 байтов, REP STOSB с использованием ERMSB может работать лучше, чем подходы SIMD, то есть при использовании регистров MMX или SSE. Когда целевой буфер не выровнен, производительность memset () при использовании ERMSB может снизиться примерно на 20% по сравнению с выровненным регистром для процессоров, основанных на кодовом имени микроархитектуры Intel Ivy Bridge. В отличие от этого, реализация REP STOSB на SIMD будет испытывать более незначительное ухудшение, если пункт назначения смещен, согласно руководству Intel по оптимизации.
Контрольные точки
Я сделал несколько тестов. Код заполнял один и тот же буфер фиксированного размера много раз, поэтому буфер оставался в кэше (L1, L2, L3), в зависимости от размера буфера. Количество итераций было таким, что общее время выполнения должно составлять около двух секунд.
Skylake
На процессоре Intel Core i5 6600, выпущенном в сентябре 2015 года и основанном на четырехъядерной микроархитектуре Skylake-S (базовая частота 3,30 ГГц, максимальная частота в турбо-режиме 3,90 ГГц) с кэш-памятью L1 4 x 32 КБ, кэш-памятью 4 x 256 КБ и кэш-памятью L3 6 МБ, Я мог получить ~ 100 ГБ / сек на REP STOSB с блоками 32 КБ.
Реализация memset (), использующая REP STOSB
:
- 1297920000 блоков по 16 байт: 13,6022 секунды 1455,9909 мегабайт / с
- 0648960000 блоки по 32 байта: 06,7840 сек 2919,3058 мегабайт / сек
- 1622400000 блоков по 64 байта: 16,9762 секунды 5833,0883 Мегабайт / с
- 817587402 блока по 127 байтов: 8,5698 секунд 11554,8914 мегабайт / с
- 811200000 блоков по 128 байт: 8,5197 сек. 11622,9306 Мегабайт / сек.
- 804911628 блоков по 129 байтов: 9,1513 сек. 10820,6427 Мегабайт / сек.
- 407190588 блоков по 255 байт: 5,4656 сек 18117,7029 Мегабайт / сек
- 405600000 блоков по 256 байт: 5,0314 сек 19681,1544 Мегабайт / сек
- 202800000 блоков по 512 байт: 2.7403 секунды 36135.8273 мегабайт / сек
- 101400000 блоков по 1024 байта: 1,6704 сек 59279,5229 мегабайт / сек
- 3168750 блоков по 32768 байт: 0,9525 секунды 103957,8488 мегабайт / с (!), То есть 10 ГБ / с
- 2028000 блоков по 51200 байт: 1,5321 сек 64633,5697 мегабайт / сек
- 413878 блоков по 250880 байт: 1,7737 сек. 55828,1341 Мегабайт / сек.
- 19805 блоков по 5242880 байт: 2.6009 сек. 38073.0694 мегабайт / сек.
Реализация memset (), использующая MOVDQA [RCX],XMM0
:
- 1297920000 блоков по 16 байт: 3,5795 сек 5532,7798 Мегабайт / сек
- 0648960000 блоки по 32 байта: 5,5538 сек 3565,9727 Мегабайт / сек
- 1622400000 блоков по 64 байта: 15,7489 сек 6287,6436 Мегабайт / сек
- 817587402 блока по 127 байтов: 9,6637 секунд 10246,9173 мегабайт / с
- 811200000 блоков по 128 байт: 9,6236 сек 10289,6215 мегабайт / сек
- 804911628 блоков по 129 байтов: 9,4852 секунды 10439,7473 мегабайт / с
- 407190588 блоков по 255 байт: 6,6156 сек 14968,1754 мегабайт / сек
- 405600000 блоков по 256 байт: 6,6437 сек 14904,9230 мегабайт / сек
- 202800000 блоков по 512 байт: 5,0695 с 19533,2299 Мегабайт / с
- 101400000 блоков по 1024 байта: 4,3506 сек 22761,0460 мегабайт / сек
- 3168750 блоков по 32768 байт: 3,7269 секунды 26569,8145 мегабайт / с (!), То есть 26 ГБ / с
- 2028000 блоков по 51200 байт: 4,0538 сек. 24427,4096 мегабайт / сек.
- 413878 блоков по 250880 байт: 3,9936 сек. 24795,5548 Мегабайт / сек.
- 19805 блоков по 5242880 байт: 4,5892 сек 21577,7860 Мегабайт / сек
Обратите внимание, что недостатком использования регистра XMM0 является то, что он составляет 128 бит (16 байтов), в то время как я мог бы использовать регистр YMM0 из 256 бит (32 байта). В любом случае stosb
использует протокол, не относящийся к RFO. Intel x86 имеет быстрые строки со времен Pentium Pro (P6) в 1996 году. Быстрые строки P6 использовали REP MOVSB и больше и реализовали их с загрузкой и сохранением 64-битного микрокода и протоколом кэширования без RFO. Они не нарушали порядок памяти, в отличие от ERMSB в Ivy Bridge. См. https://stackoverflow.com/a/33905887/6910868 для получения дополнительных сведений и источника.
В любом случае, даже если вы сравниваете только два из предложенных мною методов, и хотя второй метод далек от идеала, как видите, на 64-битных блоках rep stosb
медленнее, но начиная с 128-байтовых блоков rep stosb
начинают превосходят другие методы, и разница очень значительна, начиная с блоков размером 512 байт и более, при условии, что вы снова и снова очищаете один и тот же блок памяти в кэше.
Следовательно, для REP STOSB
максимальная скорость составляла 103957 (сто три тысячи девятьсот пятьдесят семь) мегабайт в секунду, в то время как с MOVDQA [RCX], XMM0 она составляла всего 26569 (двадцать шесть тысяч пятьсот шестьдесят девять) двадцать шесть тысяч пятьсот шестьдесят девять.
Как видите, самая высокая производительность была на блоках размером 32 КБ, что соответствует 32 КБ кеш-памяти L1 процессора, на котором я проводил тесты.
Ледяное озеро
REP STOSB против магазина AVX-512
Я также провел тесты на процессоре Intel i7 1065G7, выпущенном в августе 2019 года (микроархитектура Ice Lake / Sunny Cove), базовая частота: 1,3 ГГц, максимальная частота Turbo 3,90 ГГц. Он поддерживает набор инструкций AVX512F. Он имеет 4 кэша инструкций L1 по 32 Кбайт и кэш данных 4 x 48 Кбайт, кэш второго уровня 4 x 512 Кбайт и кэш L3 8 Мбайт.
Выравнивание по назначению
На блоках 32K, обнуленных с помощью rep stosb
, производительность составляла от 175231 МБ / с для адресата, смещенного на 1 байт (например, $ 7FF4FDCFFFFF), и быстро увеличивалась до 219464 МБ / с для выравнивания по 64 байтам (например, $ 7FF4FDCFFFC0), а затем постепенно повышалась до 222424 МБ / с для адресатов, выровненных по 256 байтам (выровненных по 256 байтам, т. Е. $ 7FF4FDCFFF00). После этого скорость не увеличивалась, даже если пункт назначения был выровнен на 32 КБ (например, 7FF4FDD00000), и все еще составлял 224850 МБ / с.
Разницы в скорости между rep stosb
и rep stosq
не было.
На буферах, выровненных по 32 КБ, скорость хранилища AVX-512 была точно такой же, как и для rep stosb
, для циклов, начинающихся с 2-х хранилищ в цикле (227777 МБ / с), и не увеличивалась для циклов, развернутых для 4-х и даже 16-ти хранилищ. . Однако для цикла из 1 магазина скорость была немного ниже - 203145 МБ / с.
Однако, если целевой буфер был смещен всего на 1 байт, скорость хранилища AVX512 резко упала, то есть более чем в 2 раза, до 93811 МБ / с, в отличие от rep stosb
на аналогичных буферах, которая давала 175231 МБ / с.
Размер буфера
- Для блоков размером 1 КБ (1024 байта) AVX-512 (205039 КБ / с) был в 3 раза быстрее, чем
rep stosb
(71817 МБ / с)
- А для блоков размером 512 байт производительность AVX-512 всегда была такой же, как и для блоков большего размера (194181 МБ / с), тогда как
rep stosb
упала до 38682 МБ / с. У этого типа блока разница была в 5 раз в пользу AVX-512.
- Для блоков 2K (2048) у AVX-512 было 210696 МБ / с, а для
rep stosb
- 123207 МБ / с, почти вдвое медленнее. Опять же, не было разницы между rep stosb
и rep stosq
.
- Для блоков 4K (4096) AVX-512 имел 225179 МБ / с, в то время как rep stosb: 180384 МБ / с, почти догоняя.
- Для блоков 8K (8192) у AVX-512 было 222259 МБ / с, а у rep stosb: 194358 МБ / с, близко!
- Для блоков размером 32 КБ (32768) у AVX-512 было 228432 МБ / с,
rep stosb
: 220515 МБ / с - наконец-то! Мы приближаемся к размеру кэша данных L0 моего процессора - 48 КБ! Это 220 Гигабайт в секунду!
- Для блоков размером 64К (65536) у AVX-512 было 61405 МБ / с,
rep stosb
: 70395 МБ / с!
- Такое огромное падение, когда у нас закончился кеш L0! И было очевидно, что с этого момента
rep stosb
начинает превосходить магазины AVX-512.
- Теперь проверим размер кеша L1. Для блоков 512 КБ AVX-512 сделал 62907 МБ / с, а
rep stosb
сделал 70653 МБ / с. Вот где rep stosb
начинает превосходить AVX-512. Разница пока не значительна, но чем больше буфер, тем больше разница.
- Теперь возьмем огромный буфер размером 1 ГБ (1073741824). С AVX-512 скорость была 14319 МБ / с,
rep stosb
это как 27412 МБ / с, то есть вдвое быстрее, чем у AVX-512!
Я также пробовал использовать невременные инструкции для заполнения буферов 32K vmovntdq [rcx], zmm31
, но производительность была примерно в 4 раза ниже, чем просто vmovdqa64 [rcx], zmm31
. Как я могу воспользоваться преимуществами vmovntdq
при заполнении буферов памяти? Должен ли быть какой-то определенный размер буфера, чтобы vmovntdq
можно было воспользоваться преимуществом?
Кроме того, если буферы назначения выровнены по крайней мере на 64 бита, разница в производительности между vmovdqa64
и vmovdqu64
отсутствует. Поэтому у меня есть вопрос: а разве инструкция vmovdqa64
нужна только для отладки и безопасности, когда у нас vmovdqu64
?
Рисунок 1. Скорость итеративного сохранения в тот же буфер, МБ / с
block AVX stosb
----- ----- ------
0.5K 194181 38682
1K 205039 205039
2K 210696 123207
4K 225179 180384
8K 222259 194358
32K 228432 220515
64K 61405 70395
512K 62907 70653
1G 14319 27412
Сводная информация о производительности многократной очистки одного и того же блока памяти в кэше
rep stosb
на процессорах Ice Lake начинает превосходить хранилища AVX-512 только для многократной очистки одного и того же буфера памяти, превышающего размер кеш-памяти L0, т.е. 48 КБ на процессоре Intel i7 1065G7. А на небольших буферах памяти хранилища AVX-512 работают намного быстрее: для 1 КБ - в 3 раза, для 512 байт - в 5 раз.
Однако хранилища AVX-512 чувствительны к смещению буферов, а rep stosb
не так чувствительны к смещению.
Таким образом, я понял, что rep stosb
начинает превосходить хранилища AVX-512 только в буферах, которые превышают размер кэша данных L0, или 48 КБ, как в случае с процессором Intel i7 1065G7. Этот вывод справедлив по крайней мере для процессоров Ice Lake. Более ранняя рекомендация Intel о том, что копирование строк начинает превосходить копию AVX, начиная с буферов 2 КБ, также следует повторно протестировать для новых микроархитектур.
Очистка разных буферов памяти, каждый только один раз
Мои предыдущие тесты многократно заполняли один и тот же буфер. Лучшим тестом может быть выделение множества разных буферов и заполнение каждого буфера только один раз, чтобы не мешать работе кеша.
В этом сценарии между хранилищами rep stosb
и AVX-512 нет большой разницы. Единственная разница заключается в том, что в 64-разрядной версии Windows 10 все данные не приближаются к пределу физической памяти. В следующих тестах общий размер данных был ниже 8 ГБ при общей физической памяти 16 ГБ. Когда я выделял около 12 ГБ, производительность упала примерно в 20 раз, независимо от метода. Windows начала сбрасывать очищенные страницы памяти и, вероятно, делала что-то еще, когда память была близка к заполнению. Размер кэша L3 8 МБ на процессоре i7 1065G7, похоже, не имел никакого значения для тестов. Важно только то, что вам не нужно приближаться к пределу физической памяти, и это зависит от вашей операционной системы, как она обрабатывает такие ситуации. Как я уже сказал, в Windows 10, если я использовал только половину физической памяти, все было в порядке, но если я использовал 3/4 доступной памяти, мой тест замедлился в 20 раз. Я даже не пробовал брать больше 3/4. Как я уже сказал, общий объем памяти составляет 16 ГБ. Доступный объем, по словам диспетчера задач, составил 12 ГБ.
Вот эталон скорости заполнения различных блоков памяти общим объемом 8 ГБ нулями (в МБ / с) на процессоре i7 1065G7 с общим объемом памяти 16 ГБ, в однопоточном режиме. Под AVX я имею в виду обычные магазины AVX-512, а под стосб я имею в виду реп стосб.
Рисунок 2. Скорость сохранения в несколько буферов, один раз каждый, МБ / с
block AVX stosb
----- ---- ----
0.5K 3641 2759
1K 4709 3963
2K 12133 13163
4K 8239 10295
8K 3534 4675
16K 3396 3242
32K 3738 3581
64K 2953 3006
128K 3150 2857
256K 3773 3914
512K 3204 3680
1024K 3897 4593
2048K 4379 3234
4096K 3568 4970
8192K 4477 5339
Вывод по очистке памяти внутри кеша
Если ваша память не существует в кэше, то производительность хранилищ AVX-512 и rep stosb
примерно одинакова, когда вам нужно заполнить память нулями. Важен именно кеш, а не выбор между этими двумя методами.
Использование невременного хранилища для очистки памяти, которой нет в кеше.
Я обнулял 6-10 ГБ памяти, разделенных последовательностью буферов, выровненных по 64 байта. Никакие буферы не обнулялись дважды. Меньшие буферы имели некоторые накладные расходы, а у меня было только 16 ГБ физической памяти, поэтому я обнулял в целом меньше памяти с меньшими буферами. Я использовал различные тесты для буферов от 256 байт до 8 ГБ на буфер. Я взял 3 разных метода:
- Обычное сохранение AVX-512 на
vmovdqa64 [rcx+imm], zmm31
(цикл из 4-х записей и затем сравнение счетчика);
- Невременное хранилище AVX-512 по
vmovntdq [rcx+imm], zmm31
(тот же цикл из 4-х магазинов);
rep stosb
.
Для небольших буферов победителем был обычный магазин AVX-512. Затем, начиная с 4 КБ, вневременной запас вышел вперед, а rep stosb
все еще отставал.
Затем из 256 КБ rep stosb
превзошел AVX-512, но не вневременное хранилище, и с тех пор ситуация не изменилась. Победителем стал невременной магазин AVX-512, затем был rep stosb
, а затем - обычный магазин AVX-512.
Рис. 3. Скорость сохранения в несколько буферов, один раз каждый, МБ / с, тремя разными способами: обычное хранилище AVX-512, временное хранилище AVX-512 и хранилище репликации.
Zeroized 6.67 GB: 27962026 blocks of 256 bytes for 2.90s, 2.30 GB/s by normal AVX-512 store
Zeroized 6.67 GB: 27962026 blocks of 256 bytes for 3.05s, 2.18 GB/s by nontemporal AVX-512 store
Zeroized 6.67 GB: 27962026 blocks of 256 bytes for 3.05s, 2.18 GB/s by rep stosb
Zeroized 8.00 GB: 16777216 blocks of 512 bytes for 3.06s, 2.62 GB/s by normal AVX-512 store
Zeroized 8.00 GB: 16777216 blocks of 512 bytes for 3.02s, 2.65 GB/s by nontemporal AVX-512 store
Zeroized 8.00 GB: 16777216 blocks of 512 bytes for 3.66s, 2.18 GB/s by rep stosb
Zeroized 8.89 GB: 9320675 blocks of 1 KB for 3.10s, 2.87 GB/s by normal AVX-512 store
Zeroized 8.89 GB: 9320675 blocks of 1 KB for 3.37s, 2.64 GB/s by nontemporal AVX-512 store
Zeroized 8.89 GB: 9320675 blocks of 1 KB for 4.85s, 1.83 GB/s by rep stosb
Zeroized 9.41 GB: 4934475 blocks of 2 KB for 3.45s, 2.73 GB/s by normal AVX-512 store
Zeroized 9.41 GB: 4934475 blocks of 2 KB for 3.79s, 2.48 GB/s by nontemporal AVX-512 store
Zeroized 9.41 GB: 4934475 blocks of 2 KB for 4.83s, 1.95 GB/s by rep stosb
Zeroized 9.70 GB: 2542002 blocks of 4 KB for 4.40s, 2.20 GB/s by normal AVX-512 store
Zeroized 9.70 GB: 2542002 blocks of 4 KB for 3.46s, 2.81 GB/s by nontemporal AVX-512 store
Zeroized 9.70 GB: 2542002 blocks of 4 KB for 4.40s, 2.20 GB/s by rep stosb
Zeroized 9.85 GB: 1290555 blocks of 8 KB for 3.24s, 3.04 GB/s by normal AVX-512 store
Zeroized 9.85 GB: 1290555 blocks of 8 KB for 2.65s, 3.71 GB/s by nontemporal AVX-512 store
Zeroized 9.85 GB: 1290555 blocks of 8 KB for 3.35s, 2.94 GB/s by rep stosb
Zeroized 9.92 GB: 650279 blocks of 16 KB for 3.37s, 2.94 GB/s by normal AVX-512 store
Zeroized 9.92 GB: 650279 blocks of 16 KB for 2.73s, 3.63 GB/s by nontemporal AVX-512 store
Zeroized 9.92 GB: 650279 blocks of 16 KB for 3.53s, 2.81 GB/s by rep stosb
Zeroized 9.96 GB: 326404 blocks of 32 KB for 3.19s, 3.12 GB/s by normal AVX-512 store
Zeroized 9.96 GB: 326404 blocks of 32 KB for 2.64s, 3.77 GB/s by nontemporal AVX-512 store
Zeroized 9.96 GB: 326404 blocks of 32 KB for 3.44s, 2.90 GB/s by rep stosb
Zeroized 9.98 GB: 163520 blocks of 64 KB for 3.08s, 3.24 GB/s by normal AVX-512 store
Zeroized 9.98 GB: 163520 blocks of 64 KB for 2.58s, 3.86 GB/s by nontemporal AVX-512 store
Zeroized 9.98 GB: 163520 blocks of 64 KB for 3.29s, 3.03 GB/s by rep stosb
Zeroized 9.99 GB: 81840 blocks of 128 KB for 3.22s, 3.10 GB/s by normal AVX-512 store
Zeroized 9.99 GB: 81840 blocks of 128 KB for 2.49s, 4.01 GB/s by nontemporal AVX-512 store
Zeroized 9.99 GB: 81840 blocks of 128 KB for 3.26s, 3.07 GB/s by rep stosb
Zeroized 10.00 GB: 40940 blocks of 256 KB for 2.52s, 3.97 GB/s by normal AVX-512 store
Zeroized 10.00 GB: 40940 blocks of 256 KB for 1.98s, 5.06 GB/s by nontemporal AVX-512 store
Zeroized 10.00 GB: 40940 blocks of 256 KB for 2.43s, 4.11 GB/s by rep stosb
Zeroized 10.00 GB: 20475 blocks of 512 KB for 2.15s, 4.65 GB/s by normal AVX-512 store
Zeroized 10.00 GB: 20475 blocks of 512 KB for 1.70s, 5.87 GB/s by nontemporal AVX-512 store
Zeroized 10.00 GB: 20475 blocks of 512 KB for 1.81s, 5.53 GB/s by rep stosb
Zeroized 10.00 GB: 10238 blocks of 1 MB for 2.18s, 4.59 GB/s by normal AVX-512 store
Zeroized 10.00 GB: 10238 blocks of 1 MB for 1.50s, 6.68 GB/s by nontemporal AVX-512 store
Zeroized 10.00 GB: 10238 blocks of 1 MB for 1.63s, 6.13 GB/s by rep stosb
Zeroized 10.00 GB: 5119 blocks of 2 MB for 2.02s, 4.96 GB/s by normal AVX-512 store
Zeroized 10.00 GB: 5119 blocks of 2 MB for 1.59s, 6.30 GB/s by nontemporal AVX-512 store
Zeroized 10.00 GB: 5119 blocks of 2 MB for 1.54s, 6.50 GB/s by rep stosb
Zeroized 10.00 GB: 2559 blocks of 4 MB for 1.90s, 5.26 GB/s by normal AVX-512 store
Zeroized 10.00 GB: 2559 blocks of 4 MB for 1.37s, 7.29 GB/s by nontemporal AVX-512 store
Zeroized 10.00 GB: 2559 blocks of 4 MB for 1.47s, 6.81 GB/s by rep stosb
Zeroized 9.99 GB: 1279 blocks of 8 MB for 2.04s, 4.90 GB/s by normal AVX-512 store
Zeroized 9.99 GB: 1279 blocks of 8 MB for 1.51s, 6.63 GB/s by nontemporal AVX-512 store
Zeroized 9.99 GB: 1279 blocks of 8 MB for 1.56s, 6.41 GB/s by rep stosb
Zeroized 9.98 GB: 639 blocks of 16 MB for 1.93s, 5.18 GB/s by normal AVX-512 store
Zeroized 9.98 GB: 639 blocks of 16 MB for 1.37s, 7.30 GB/s by nontemporal AVX-512 store
Zeroized 9.98 GB: 639 blocks of 16 MB for 1.45s, 6.89 GB/s by rep stosb
Zeroized 9.97 GB: 319 blocks of 32 MB for 1.95s, 5.11 GB/s by normal AVX-512 store
Zeroized 9.97 GB: 319 blocks of 32 MB for 1.41s, 7.06 GB/s by nontemporal AVX-512 store
Zeroized 9.97 GB: 319 blocks of 32 MB for 1.42s, 7.02 GB/s by rep stosb
Zeroized 9.94 GB: 159 blocks of 64 MB for 1.85s, 5.38 GB/s by normal AVX-512 store
Zeroized 9.94 GB: 159 blocks of 64 MB for 1.33s, 7.47 GB/s by nontemporal AVX-512 store
Zeroized 9.94 GB: 159 blocks of 64 MB for 1.40s, 7.09 GB/s by rep stosb
Zeroized 9.88 GB: 79 blocks of 128 MB for 1.99s, 4.96 GB/s by normal AVX-512 store
Zeroized 9.88 GB: 79 blocks of 128 MB for 1.42s, 6.97 GB/s by nontemporal AVX-512 store
Zeroized 9.88 GB: 79 blocks of 128 MB for 1.55s, 6.37 GB/s by rep stosb
Zeroized 9.75 GB: 39 blocks of 256 MB for 1.83s, 5.32 GB/s by normal AVX-512 store
Zeroized 9.75 GB: 39 blocks of 256 MB for 1.32s, 7.38 GB/s by nontemporal AVX-512 store
Zeroized 9.75 GB: 39 blocks of 256 MB for 1.64s, 5.93 GB/s by rep stosb
Zeroized 9.50 GB: 19 blocks of 512 MB for 1.89s, 5.02 GB/s by normal AVX-512 store
Zeroized 9.50 GB: 19 blocks of 512 MB for 1.31s, 7.27 GB/s by nontemporal AVX-512 store
Zeroized 9.50 GB: 19 blocks of 512 MB for 1.42s, 6.71 GB/s by rep stosb
Zeroized 9.00 GB: 9 blocks of 1 GB for 1.76s, 5.13 GB/s by normal AVX-512 store
Zeroized 9.00 GB: 9 blocks of 1 GB for 1.26s, 7.12 GB/s by nontemporal AVX-512 store
Zeroized 9.00 GB: 9 blocks of 1 GB for 1.29s, 7.00 GB/s by rep stosb
Zeroized 8.00 GB: 4 blocks of 2 GB for 1.48s, 5.42 GB/s by normal AVX-512 store
Zeroized 8.00 GB: 4 blocks of 2 GB for 1.07s, 7.49 GB/s by nontemporal AVX-512 store
Zeroized 8.00 GB: 4 blocks of 2 GB for 1.15s, 6.94 GB/s by rep stosb
Zeroized 8.00 GB: 2 blocks of 4 GB for 1.48s, 5.40 GB/s by normal AVX-512 store
Zeroized 8.00 GB: 2 blocks of 4 GB for 1.08s, 7.40 GB/s by nontemporal AVX-512 store
Zeroized 8.00 GB: 2 blocks of 4 GB for 1.14s, 7.00 GB/s by rep stosb
Zeroized 8.00 GB: 1 blocks of 8 GB for 1.50s, 5.35 GB/s by normal AVX-512 store
Zeroized 8.00 GB: 1 blocks of 8 GB for 1.07s, 7.47 GB/s by nontemporal AVX-512 store
Zeroized 8.00 GB: 1 blocks of 8 GB for 1.21s, 6.63 GB/s by rep stosb
Как избежать штрафов за переход AVX-SSE
Для всего кода AVX-512 я использовал регистр ZMM31
, потому что регистры SSE имеют значения от 0 до 15, поэтому регистры AVX-512 с 16 по 31 не имеют своих аналогов SSE, поэтому не влекут за собой штраф за переход.
person
Maxim Masiutin
schedule
07.05.2017
rep stosb
- это оптимизированная инструкция для этой цели. - person Jester   schedule 02.11.2015