774 Тем для обсуждения
6,825 Открытых обсуждений
- Association for Computing Machinery TechNews (ACM)
- Go Parallel! (Dr. Dobbs)
- HPCwire (Tabor Communications, Inc.)
- insideHPC (John West)
- Joe Duffy's Weblog (Microsoft)
- Microsoft Parallel Programming Development Center (Microsoft Germany)
- MultiCoreInfo.com
- scalability.org (Scalable Informatics)
- Software Dev Blog (Intel Germany)
- Soft Talk Blog (Intel United Kingdom)
- The Moth (Microsoft)
Как написать быстрый видео транскодер на Intel® Media SDK. Эпизод 1
Slava Korobycin (Intel) (5 пост(а)) 19.03.2010 14:37
Синхронная однопотоковая модель. Просто и медленно
Я планирую описать и сравнить несколько моделей транскодирования видео, чтобы выявить их сильные и слабые стороны. Надеюсь, это поможет Вам в разработке оптимальной реализации для решения Ваших задач. Это первая часть из серии публикаций. Речь в ней пойдёт о самой простой модели, которая поможет новичкам разобраться, как работает транскодирование на платформах с аппаратным ускорением графики.
Синхронная однопотоковая модель хорошо подходит для начального исследования процесса транскодирования. Её реализация предельно проста и наглядна для демонстрации обрабатывающих элементов и организации потока данных. Платой за простоту является низкое быстродействие, потому что кадры обрабатываются последовательно Decode, Video Preprocessing (VPP) и Encode. Каждый кадр проходит все три стадии от входного потока до выходного и только после этого начинается обработка следующего кадра как показано на Диаграмме 1.
Приведённый ниже псевдо-код иллюстрирует реализацию рассматриваемой модели. Заметьте, каждая стадия обработки может быть хорошо оптимизирована, чтобы получить выигрыш от multi-core оборудования. Поэтому около каждого вызова организован цикл, который ждёт завершения операции, это называется синхронизацией (Sync)
while (there is data to process)
{
do
{ status = DecodeFrame();
if (status == FatalError) return Error;
if (status == NonFatalError) FixDecodeError(); // Error handling
} while(status != Success); // Sync
do
{ status = VPPFrame();
if (status == FatalError) return Error;
if (status == NonFatalError) FixVPPError(); // Error handling
} while(status != Success); // Sync
do
{ status = EncodeFrame();
if (status == FatalError) return Error;
if (status == NonFatalError) FixEncodeError(); // Error handling
} while(status != Success); // Sync
WriteFrame();
}
return Success;
Мы предполагаем, что платформа поддерживает аппаратное ускорение Decode и VPP, а Encode выполняется на CPU. Эта модель транскодирования теряет много вычислительных ресурсов как CPU, так и GPU, потому что Encode вынужден ждать завершения работы Decode и VPP, а Decode вынужден ждать, когда Encode завершит обработку предыдущего кадра. В лучшем случае теряется половина ресурсов как это показано на Диаграмме 2.
Разумеется, существует множество способов, как улучшить быстродействие. Можете ли Вы предложить некоторые из них?
Со своей стороны я планирую позже опубликовать другую модель, в которой проблема быстродействия в значительной степени решена.
Спасибо за внимание!
Слава.
Категории: Графика
Пожалуйста, обратитесь к странице Уведомление об оптимизации для более подробной информации относительно производительности и оптимизации в программных продуктах компании Intel.
Комментарии (13)
| 19.03.2010 05:32
Dmitry Oganezov (Intel)
| Я как инсайдер, который читает все посты нашего блога, в том числе вот этот (http://software.intel.com/ru-ru/blogs/2009/07/20/2001715/) предлагаю сразу уйти от схемы распараллеливания "по кадрам" ;) |
| 19.03.2010 05:35
Slava Korobycin (Intel)
| Хорошо! Действительно, грамотно реализованный буфер сильно поможет. Есть ещё идеи? :) |
| 19.03.2010 05:38
Slava Korobycin (Intel)
| Дима, по-моему в блоге про который ты говоришь описано как написать хороший параллельный декодер. А у нас тут и декодер, и VPP, и энкодер. :) Могу расценивать твой совет так: "написать транскодер одной функцией"? :) |
| 19.03.2010 06:12
Dmitry Oganezov (Intel)
|
Как все сложно! ;) Если честно то у меня мозг отключается уже на этапе синхронизации CPUGPU. Идея с буфером хороша, но если углубляться в распараллеливание по блокам (или как там эти фрагменты кадра называются), то синхронизация создаст ИМХО слишком большой оверхед. |
| 19.03.2010 06:23
Slava Korobycin (Intel)
|
Дима, очень хороший комментарий. :) На самом деле, то, что отключается мозг это хорошо. :))) Я планирую нежно подвести читателя к Intel® Media SDK и напомнить: "вот видите, как было неудобно, а с Intel® Media SDK стало хорошо" |
| 19.03.2010 07:28
Dmitry Kozlov (Intel)
| пока не пришел Леша Куканов, могу предположить что TBB'шный pipeline должен подойти для решения данной проблемы |
| 19.03.2010 12:31
Dmitry Serkin (Intel)
| Эх, снять что-ли всю интригу :) |
| 23.03.2010 01:56
ilnarb
|
>> Эх, снять что-ли всю интригу :) ДАВАЙ!! )) |
| 23.03.2010 06:01
Slava Korobycin (Intel)
|
Дима, TBB -- это интересная идея. Можешь прикинуть как преобразится приведённый выше псевдо-код, если его написать с использованием TBB? Останется ли он таким же простым и понятным? ;) Кстати, при транскодировании нередко на разных стадиях возникают ошибки, которые нужно правильно обрабатывать прежде чем продолжить процесс. А это добавляет зависимостей в цепочку, да не простых, а условных (например: если Decode получилось, то пускаем VPP; иначе что-то чиним в Decode и пускаем его повторно) |
| 11.04.2010 02:16
Стас |
Slava Korobycin (Intel) ... при транскодировании нередко на разных стадиях возникают ошибки У меня аналогичная проблема, как решить? |
| 30.04.2010 05:30
Slava Korobycin (Intel)
|
Стас, какого рода у тебя проблема? В данной модели всё довольно просто: случилась ошибка, мы об этом тут же узнали. Пытаемся её устранить, возможно просто какую-то компоненту нужно переинициализировать с новыми параметрами. Если получилось, то стартуем процесс с того же места где мы были до ошибки. Если не получилось, то прекращаем процесс. |
| 26.10.2011 12:53
575-61
| А что, метод пузырьковой сортировки - тоже метод... |
Обратная ссылка (3)
- Как написать быстрый видео транскодер на Intel® Media SDK. Эпизод 2 – Блоги Intel® Software Network
25.03.2010 06:52 - Как написать быстрый видео транскодер на Intel® Media SDK. Эпизод 3 – Блоги Intel® Software Network
31.03.2010 06:08 -
Twitter Trackbacks for
Как написать быстрый видео транскодер на Intel® Media SDK. Эпизод 1 – Блоги Intel® Software Network
[intel.com]
on Topsy.com
17.06.2010 02:28







ilnarb
5,804
и тогда в идеале GPU или CPU не будет простаивать (в зависимости от того кто быстрее справляется)