内联SSE2程序集因数据更改而崩溃

时间:2018-07-24 14:05:36

标签: c++ assembly x86 intrinsics sse2

我在C ++中具有以下代码。指针_p_s1和_p_s2指向更大的存储视频帧的存储区中的切片(每隔第二条视频行)(我们称之为* pFrameData)。只要pFrameData指向的内存区域中的数据发生变化,此代码就会按预期工作。

但是,如果发生这种情况,我需要更改pFrameData,则此代码会崩溃并显示错误:

  

引发异常:读取访问冲突。

     

p2 为0xFFFFFFFFFFFFFFFFFF。

我有一个标量版本的代码,并且在更改期间工作正常。这使我认为SSE ​​register(?)会以某种方式保留指向旧pFrameData所指向的内存区域的指针,并且由于该指针已释放,因此会崩溃。

有什么办法可以解决这个问题?我正在X64环境中运行此代码。

void Merge8BitSSE2(uint8_t *_p_dest, const uint8_t *_p_s1, const uint8_t *_p_s2,
size_t i_bytes)
{

for (; i_bytes > 0 && ((uintptr_t)_p_s1 & 15); i_bytes--)
    *_p_dest++ = (*_p_s1++ + *_p_s2++) >> 1;

for (; i_bytes >= 16; i_bytes -= 16)
{
    __m128i xmm;
    __m128i *adst = (__m128i*)_p_dest;
    __m128i *p1 = (__m128i*)_p_s1;
    __m128i *p2 = (__m128i*)_p_s2;

    xmm = _mm_loadu_si128(p1);
    xmm = _mm_avg_epu8(xmm, *p2);
    *adst = _mm_loadu_si128(&xmm);

    _p_dest += 16;
    _p_s1 += 16;
    _p_s2 += 16;

}

for (; i_bytes > 0; i_bytes--)
    *_p_dest++ = (*_p_s1++ + *_p_s2++) >> 1;
}

0 个答案:

没有答案