Другие, чем счетчик цикла, нет никакой цепи зависимостей петли несут. Таким образом, операции с разных итераций цикла могут быть в полете сразу. Это означает, что латентность не является узким местом, а просто пропускной способностью (исполнительных блоков и интерфейсом (до 4 подключений с плавным доменом на каждый такт)).
Кроме того, ваши номера абсолютно безумны. mov
Нагрузки не принимают 4 исполнительных блока ALU! И числа задержки загрузки/хранения ошибочны/бессмысленны (см. Последний раздел).
# Scalar (serial is the wrong word. Both versions are serial, not parallel)
.L16:
movl (%r9,%rax), %edx // fused-domain uops: 1. Unfused domain: a load port
addl (%r8,%rax), %edx // fused-domain uops: 2 Unfused domain: a load port and any ALU port
movl %edx, c_result(%rcx,%rax) // fused-domain uops: 2 Unfused domain: store-address and store-data ports. port7 can't handle 2-reg addresses
addq $4, %rax // fused-domain uops: 1 unfused: any ALU
cmpq $4096, %rax // fused-domain uops: 0 (fused with jcc)
jne .L16 // fused-domain uops: 1 unfused: port6 (predicted-taken branch)
Итого: 7 слита-домен микрооперация означает, что цикл может выдавать из буфера петли на одной итерации на 2с. (не на 1,75 в). Поскольку мы используем сочетание загрузок, хранилищ и модулей ALU, порты выполнения не являются узким местом, а только шириной проблемы с объединенным доменом. Две нагрузки на 2c и один магазин на 2c - это только половина пропускной способности блоков загрузки и хранения.
Обратите внимание, что режимы адресации с двумя регистрами can't micro-fuse on Intel SnB-family. Это не проблема для чистых нагрузок, потому что они равны 1 мкп даже без микро-слияния.
Анализ идентичен для векторного цикла. (vpaddd
имеет латентность 1c на Skylake и почти каждый другой процессор. Таблица не перечисляет ничего в столбце задержки для padd
с операндом памяти, так как время ожидания нагрузки не зависит от задержки добавления. добавляет один цикл в DEP цепи с участием регистра SRC/Dest, до тех пор, как адрес нагрузки знаю достаточно далеко впереди времени.)
магазина и латентность нагрузки чисел Agner противотуманными являются своего рода поддельным тоже. Он произвольно делит общую задержку в обратном направлении нагрузки (с сохранением-хранением) на число латентности для загрузки и хранения. IDK, почему он не перечислял задержку загрузки, измеренную с помощью теста на сканирование указателя (например, повторный mov (%rsi), %rsi
). Это свидетельствует о том, что процессоры Intel SnB-семейства имеют 4 байта задержки загрузки.
Я хотел послать ему записку об этом, но не добрался до него.
Вы должны быть видим AVX2 убыстрение 32/4, т.е. 8х. Размер вашей проблемы составляет только 4096B, что достаточно мало для трех массивов такого размера, чтобы вставить в кеш L1. (РЕДАКТ: вопрос вводит в заблуждение: показан цикл, представляющий собой внутренний цикл вложенного цикла. См. Комментарии: по-видимому, даже с 4k массивами (не 4M), OP все еще только видел 3x ускорение (против 1.5x с 4M массивами), поэтому в версии AVX есть какое-то узкое место.)
Все 3 массива выровнены, так что это не переход к кеш-линии в операнде памяти , который не требует выравнивания (%r8
).
Моя другая теория на этом тоже не кажется очень вероятной, но ваши адреса массива смещены друг от друга точно в 4096B? Из Agner противотуманными в microarch PDF:
Это не возможно читать и писать одновременно с адресами , которые разнесены на кратное 4 кбайт
пример показывает магазин затем загрузить, хотя, так IDK, если это действительно объясняется. Даже если аппаратное обеспечение для хранения памяти считает, что загрузка и хранение могут быть на одном и том же адресе, я не уверен, почему это остановит код для поддержки как можно большего количества операций с памятью или почему это повлияет на код AVX2 хуже, чем скалярный код ,
Стоит попытаться компенсировать ваши массивы друг от друга дополнительными 128B или 256B или еще чем-то.
Выравнивание памяти составляет 32 байт, размер строки кеша L1D составляет 64 байт и 8 путей, я все еще исследую. Но мне нужен профессиональный лидер, Да, я знаю его воскресенье. – ADMS
Вы уже пробовали IACA? Это не сделало Skylake, последний раз я посмотрел, но результаты на Хасуэлла могут помочь. Кроме того, ознакомьтесь с таблицами инструкций Agner Fog. (Http://www.agner.org/optimize/instruction_tables.pdf) – jbapple
Ваш код, вероятно, не вычисляется, а привязан к памяти. Вы не можете получить быстрее, чем ваша шина памяти может предоставлять данные. –