将 SSE 指令与 Libavcodec 一起使用
Use of SSE instructions along side with Libavcodec
我编写了一个简单的视频会议应用程序,该应用程序使用多个线程进行视频和音频混合。我使用libavcodec(ffmpeg)编解码器来混合视频。据我所知,libavcodec 使用 SSE 指令来实现高性能。对于音频混音,我使用一种简单的混音算法,它只是添加样本。我已经在 C++ 中编写了带有 sipmle for
循环的加法算法,但现在我想使用 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 寄存器和指令,我的代码与之冲突。有没有办法在不与libvcodec(ffmpeg)发生任何冲突的情况下使用SSE指令?任何建议表示赞赏。
只要您使用现代编译器(更新于 10 年)并且您没有在汇编中编码,上下文切换就应该没问题。编译器知道其目标平台的 ABI,因此您不必这样做。
如果您包含导致应用崩溃的确切代码,则最可能的原因是对齐问题。将_mm_load_si128
替换为_mm_loadu_si128
,_mm_store_si128
替换为_mm_storeu_si128
,看看是否有帮助。
更新 1:另一个可能的原因是 SSE 版本完成得太快,这会触发并发错误。尝试添加例如 Sleep( 2 )
循环后的调用,如果视频工作正常,则意味着您需要修复跨线程推送或拉取数据的代码。
更新2:正如Alan指出的那样,数组(缓冲区)的大小可能不是16字节(16 * (nSizeToMix + 7) / 8
)的倍数。这肯定会导致您的应用程序崩溃或内存损坏。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 如何将AERT_Allocate与 std:vector 一起使用
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 将 SSE 指令与 Libavcodec 一起使用