Кажется, что повторяющаяся проблема, что многие процессоры Intel (вплоть до Skylake, если я ошибаюсь) демонстрируют низкую производительность при смешивании инструкций AVX-256 с SSE инструкции.
Согласно документации Intel, это вызвано инструкциями SSE, которые определены для сохранения верхних 128 бит регистров YMM, поэтому в порядке чтобы иметь возможность экономить электроэнергию, не используя верхние 128 бит данных datapaths, процессор сохраняет эти биты при выполнении кода SSE и перезагружает их при вводе кода AVX, магазины и нагрузки стоят дорого.
Однако я не могу найти очевидной причины или объяснения, почему инструкции SSE необходимы для сохранения этих верхних 128 бит. Соответствующие 128-битные инструкции VEX (использование которых позволяет избежать снижения производительности) работают, всегда очищая верхние 128 бит регистров YMM, а не сохраняя их. Мне кажется, что когда Intel определила архитектуру AVX, в том числе расширение регистров XMM в регистры YMM, они могли бы просто определить, что инструкции SSE также очистят верхние 128 бит. Очевидно, что, поскольку регистры YMM были новыми, не могло быть никакого устаревшего кода, который зависел бы от инструкций SSE, сохраняющих эти биты, и также мне кажется, что Intel могла бы легко увидеть это.
Итак, в чем причина, почему Intel определила инструкции SSE для сохранения верхних 128 бит регистров YMM? Это когда-нибудь полезно?