Использование инструкций SSE наряду с Libavcodec

Я написал простое приложение для видеоконференций, которое использует несколько потоков для микширования видео и аудио. Я использую кодеки libavcodec (ffmpeg) для микширования видео. Как я знаю, libavcodec использует инструкции SSE для достижения высокой производительности. Для микширования аудио я использую простой алгоритм микширования, который просто добавляет сэмплы. Я написал алгоритм добавления с sipmle for цикл в C ++, но теперь я хочу оптимизировать его с помощью инструкций SSE, таких как:

__m128i* d = (__m128i*) pOutBuffer;
__m128i* s = (__m128i*) pInBuffer;
for (DWORD n = (DWORD)(nSizeToMix + 7) >> 3; n != 0; --n, ++d, ++s)
{
//Load data in SSE registers
__m128i xmm1 = _mm_load_si128(d);
__m128i xmm2 = _mm_load_si128(s);
//SSE2 sum
_mm_store_si128(d, _mm_add_epi16(xmm1, xmm2));
}

Микширование аудио выполняется отдельным потоком одновременно с микшированием видео. Когда я использую инструкции SSE, приложение внезапно падает в положении, не связанном с микшированием звука, при кодировании / декодировании видео.

Кажется, потому что libavcodec использует регистры и инструкции SSE, мой код конфликтует с ним. Есть ли способ использовать инструкции SSE без каких-либо конфликтов с libvcodec (ffmpeg)? Любые предложения приветствуются.

-1

Решение

Переключатели контекста должны быть в порядке, если вы используете современный компилятор (не старше 10 лет) и не программируете в сборке. Компиляторы знают ABI для своих целевых платформ, поэтому вам не нужно.

Если вы включили точный код, вызвавший сбой вашего приложения, наиболее вероятной причиной являются проблемы с выравниванием. замещать _mm_load_si128 с _mm_loadu_si128, _mm_store_si128 с _mm_storeu_si128 и посмотрим, поможет ли это.

Обновить: Другая возможная причина — SSE-версия завершается слишком быстро, и это вызывает ошибку параллелизма. Попробуйте добавить, например, Sleep( 2 ) вызов после цикла, если видео будет работать нормально, это означает, что вам нужно исправить код, который перемещает данные по потокам.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]