Использование инструкций SSE наряду с Libavcodec - PullRequest
0 голосов
/ 03 января 2019

Я написал простое приложение для видеоконференций, которое использует несколько потоков для микширования видео и аудио.Я использую кодеки 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 Ответ

0 голосов
/ 03 января 2019

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

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

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

Обновление 2: As AlanКак указывалось выше, размер массивов (буферов) не может быть кратным 16 байтам (16 * (nSizeToMix + 7) / 8).Это, безусловно, приведет к сбою вашего приложения или повреждению памяти.

...