Некоторое время назад разработчик Вадим Гирлин (Vadim Girlin) представил собственную ветку MESA, в котором включен оптимизированный кодогенератор шейдеров для GPU, поддерживаемых драйвером R600g. Представленный код генерирует шейдеры, которые значительно более оптимизированы, чем шейдеры, генерируемые текущей версией кодогенераторов в драйвере R600g (как своего собственного, так и на основе LLVM).
В частности, разработчик продемонстрировал существенное увеличение FPS в тесте Unigine Heaven с использованием собственного кодогенератора, что значительно превосходит результат, демонстрируемый неоптимизированным штатным вариантом кодогенератора, а также кодогенератором на основе LLVM.
В результате в списке рассылки возникла полемика. Разработчики из компании AMD полагают, что у штатного кодогенератора, встроенного в драйвер R600g, нет перспектив и он будет постепенно заменен на кодогенератор, основанный на LLVM по мере его готовности. Аргументами за такое решение служит потенциальное упрощение разработки (теоретически достаточно разрабатывать только backend, осуществляющий генерацию нативного потока команд GPU), упрощение реализации OpenCL и т.п.
С другой стороны, разработчик Vadim Girlin отметил что реализация тех же самых оптимизаций в LLVM является сложной и нетривиальной задачей, так что он не смог бы реализовать свои оптимизации в LLVM с теми же затратами усилий. Кроме того, он констатировал, что за довольно существенное время разработки бэкэнда на основе LLVM не было достигнуто практически никаких видимых для пользователей результатов, что по его мнению ставит под вопрос целесообразность такого подхода.
В результате возникло некое противоречие: с одной стороны все разработчики согласны, что оптимизации дают весьма заметный эффект в нагрузках, активно использующих шейдеры. С другой стороны, разработчики считают LLVM более перспективным, чем собственный кодогенератор в долгосрочной перспективе.
Тем не менее, разработчику Vadim Girlin судя по всему удалось найти компромиссное решение, которое устроит обе стороны, участвовавшие в полемике. Недавно разработчик представил свой новый вариант оптимизатора. В данном случае разработчик постарался максимально отвязать оптимизатор от остальных частей драйвера. Суть идеи в том, что оптимизатор подключается через некоторые точки в драйвере и получает от него уже готовый код GPU, над которым и выполняет оптимизации.
Такой подход позволяет оптимизатору успешно сосуществовать как с собственным кодогенератором, так и с кодогенератором на основе LLVM. Более того, оптимизатор показал заметное улучшение производительности как с классическим кодогенератором, так и с LLVM. В результате выигрыш наблюдается в практически всех нагрузках, использующих шейдеры или вычисления на GPU, вплоть до майнинга биткоинов с использованием открытых драйверов.
Данная инициатива вызвала одобрительную оценку большинства разработчиков, которые теперь не видят препятствий для включения оптимизатора в состав драйвера R600G. Вероятно, потребуется доработка и переделка, однако в целом такой подход вызвал одобрение большинства разработчиков драйвера.
|