Совлокальный вопрос и год: Разрабатывают ли какие-либо JIT-компиляторы JVM код с использованием векторизованных инструкций с плавающей запятой?
Предисловие: Я пытаюсь сделать это в чистой java (нет JNI на С++, нет работы GPGPU и т.д.). Я профилировал, и основная часть времени обработки исходит из математических операций в этом методе (что, вероятно, составляет 95% математики с плавающей запятой и 5% целочисленной математики). Я уже уменьшил все вызовы Math.xxx() до приближения, которые достаточно хороши, поэтому большая часть математики теперь с плавающей запятой умножается на несколько добавлений.
У меня есть код, который касается обработки звука. Я делаю трюки и уже наткнулся на большие успехи. Теперь я просматриваю ручную развертку, чтобы увидеть, есть ли какая-либо выгода (по крайней мере, с ручным разворачиванием 2, я вижу примерно 25% -ное улучшение). Пробовав мою руку при ручном разворачивании 4 (что начинает очень сложно, так как я разворачиваю обе петли вложенного цикла), мне интересно, есть ли что-нибудь, что я могу сделать, чтобы намекнуть на jvm, что во время выполнения он может использовать вектор (например, SSE2, AVX и т.д.). Каждый образец аудио может быть рассчитан полностью независимо от других образцов, поэтому я уже смог увидеть улучшение на 25% (уменьшая количество зависимостей от вычислений с плавающей запятой).
Например, у меня есть 4 поплавки, по одному для каждого из 4 разворот цикла, чтобы удерживать частично вычисленное значение. Как я заявляю и использую эти поплавки? Если я сделаю это float [4], это намекает на jvm, что они не связаны друг с другом vs с float, float, float, float или даже с классом из 4 общедоступных плавающих точек? Есть ли что-то, что я могу сделать без смысла, что убьет мой шанс на векторизованный код?
Я столкнулся с статьями онлайн о написании кода "нормально", потому что компилятор /jvm знает общие шаблоны и как их оптимизировать, а отклонение от шаблонов может означать меньшую оптимизацию. По крайней мере, в этом случае, однако, я бы не ожидал, что разворачивает циклы на 2, чтобы улучшить производительность, насколько это было возможно. Мне интересно, есть ли что-нибудь еще, что я могу сделать (или, по крайней мере, не делать), чтобы помочь мне шансы. Я знаю, что компилятор /jvm только поправится, поэтому я также хочу быть осторожным в том, чтобы делать что-то, что повредит мне в будущем.
Отредактируйте для любопытных: разворачивание на 4 увеличилось на 25% за разматывание на 2, поэтому я действительно думаю, что векторные операции помогут в моем случае, если jvm поддерживает его (или, возможно, уже использует их).
Спасибо!