Я написал простое приложение для видеоконференций, которое использует несколько потоков для микширования видео и аудио. Я использую кодеки 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)? Любые предложения приветствуются.
Переключатели контекста должны быть в порядке, если вы используете современный компилятор (не старше 10 лет) и не программируете в сборке. Компиляторы знают ABI для своих целевых платформ, поэтому вам не нужно.
Если вы включили точный код, вызвавший сбой вашего приложения, наиболее вероятной причиной являются проблемы с выравниванием. замещать _mm_load_si128
с _mm_loadu_si128
, _mm_store_si128
с _mm_storeu_si128
и посмотрим, поможет ли это.
Обновить: Другая возможная причина — SSE-версия завершается слишком быстро, и это вызывает ошибку параллелизма. Попробуйте добавить, например, Sleep( 2 )
вызов после цикла, если видео будет работать нормально, это означает, что вам нужно исправить код, который перемещает данные по потокам.
Других решений пока нет …