В рекламе своих видеокарт NVIDIA и AMD частенько приводят возможность быстрого сжатия видео как наглядный пример полезности вычислительных возможностей GPGPU для рядового потребителя. Но об ускорении сжатия аудио с помощью GPGPU слышно гораздо меньше. Несколько лет назад NVIDIA объявляла конкурс на реализацию кодировщика mp3 с помощью технологии CUDA, но судя по отсутствию какой-либо информации о результатах конкурса, затея не удалась. Между тем, сама по себе идея ускорения сжатия аудио вполне реализуема, и актуальна для многих пользователей, тратящих массу времени на оцифровку своей коллекции компакт-дисков.
Я решил начать с анализа форматов сжатия звука без потерь (lossless), так как постоянное увеличение объёма носителей и удешевление дискового пространства уже сегодня позволяет не идти на компромиссы между экономией места и качеством звука. Идеальным кандидатом оказался популярный формат FLAC. Его главными достоинствами являются открытость стандарта и широкая аппаратная поддержка. Вдобавок он оказался удивительно хорошо приспособлен к параллельной обработке - в отличие от многих конкурирующих кодеков (ALAC, TTA...).
Первые же эксперименты показали перспективность этого начинания: буквально за пару дней удалось ускорить сжатие в некоторых режимах. Достичь же по настоящему впечатляющих результатов удалось только перенеся практически весь алгоритм, благо не очень сложный, на GPGPU, минимизировав обмен данных с видеокартой по шине PCIe. Новый flac-кодировщик, получившй название FlaCuda, сжимает быстрее чем стандартный flac в самом быстром режиме, при том что превосходит по сжатию flac в самом медленном режиме. Даже на такой скромной видеокарте, как NVIDIA GTS 250, скорость сжатия теперь лимитируется в основном скоростью жесткого диска.
К сожалению, обратная задача - быстрой декомпрессии аудио - выглядит почти безнадёжной. Алгоритм декомпресии FLAC достаточно шустро работает при последовательном декодировании, благодаря чему и получил широкую аппаратную поддержку со стороны производителей плееров и медиа-центров, однако принципиально не годится для параллельной обработки.