C++ 访问冲突\u mm\u存储\u si128 SSE内部函数

C++ 访问冲突\u mm\u存储\u si128 SSE内部函数,c++,image-processing,x86,sse,simd,C++,Image Processing,X86,Sse,Simd,我想在8位灰度图像中创建垂直梯度的直方图。 可以指定用于计算坡度的垂直距离。 我已经使用intrinsic设法加速了代码的另一部分,但它在这里不起作用。 如果注释掉了_mm_store_si128,代码将毫无例外地运行。 当它没有被评论时,我得到一个访问冲突 这里出了什么问题 #define _mm_absdiff_epu8(a,b) _mm_adds_epu8(_mm_subs_epu8(a, b), _mm_subs_epu8(b, a)) //from opencv void Create

我想在8位灰度图像中创建垂直梯度的直方图。 可以指定用于计算坡度的垂直距离。 我已经使用intrinsic设法加速了代码的另一部分,但它在这里不起作用。 如果注释掉了_mm_store_si128,代码将毫无例外地运行。 当它没有被评论时,我得到一个访问冲突

这里出了什么问题

#define _mm_absdiff_epu8(a,b) _mm_adds_epu8(_mm_subs_epu8(a, b), _mm_subs_epu8(b, a)) //from opencv
void CreateAbsDiffHistogramUnmanaged(void* source, unsigned int sourcestride, unsigned int height, unsigned int verticalDistance, unsigned int histogram[])
{
unsigned int xcount = sourcestride / 16;
__m128i absdiffData;
unsigned char* bytes = (unsigned char*) _aligned_malloc(16, 16);
__m128i* absdiffresult = (__m128i*) bytes;
__m128i* sourceM = (__m128i*) source;
__m128i* sourceVOffset = (__m128i*)source + verticalDistance * sourcestride;

for (unsigned int y = 0; y < (height - verticalDistance); y++)
{
    for (unsigned int x = 0; x < xcount; x++, ++sourceM, ++sourceVOffset)
    {
        absdiffData = _mm_absdiff_epu8(*sourceM, *sourceVOffset);
        _mm_store_si128(absdiffresult, absdiffData);
        //unroll loop
        histogram[bytes[0]]++;
        histogram[bytes[1]]++;
        histogram[bytes[2]]++;
        histogram[bytes[3]]++;
        histogram[bytes[4]]++;
        histogram[bytes[5]]++;
        histogram[bytes[6]]++;
        histogram[bytes[7]]++;
        histogram[bytes[8]]++;
        histogram[bytes[9]]++;
        histogram[bytes[10]]++;
        histogram[bytes[11]]++;
        histogram[bytes[12]]++;
        histogram[bytes[13]]++;
        histogram[bytes[14]]++;
        histogram[bytes[15]]++;
    }
}
_aligned_free(bytes);
}
#定义mm_absdiff_epu8(a,b)mm_添加epu8(mm_subs_epu8(a,b),mm_subs_epu8(b,a))//来自opencv
void createAbsDiffHistorogramUnmanaged(void*源、无符号整数源Stride、无符号整数高度、无符号整数垂直距离、无符号整数直方图[])
{
unsigned int xcount=sourcestride/16;
__m128i数据;
无符号字符*字节=(无符号字符*)\u对齐\u malloc(16,16);
__m128i*absdiffresult=(u m128i*)字节;
__m128i*源m=(u m128i*)源;
__m128i*sourceVOffset=(uu m128i*)震源+垂直距离*sourcestride;
对于(无符号整数y=0;y<(高度-垂直距离);y++)
{
for(无符号整数x=0;x
您的函数在加载时崩溃,因为输入数据未对齐。为了解决问题,您必须更改代码:

发件人:

致:

这里我使用了未对齐加载

另外,我已经在中实现了类似的函数(SimdAbsSecondDerivativeHistogram)。它已经完成了,并且实现了。我希望它能帮助你

p.p.S.另外,我强烈建议检查这一行:

__m128i* sourceVOffset = (__m128i*)source + verticalDistance * sourcestride);
这可能导致崩溃(访问输入阵列之外的内存)。也许你在想:

__m128i* sourceVOffset = (__m128i*)((char*)source + verticalDistance * sourcestride);

非常感谢你的帮助。我尝试了你的改进,但错误仍然存在。此外,我知道输入数据是对齐的,因为我正在对同一数据执行其他操作。@JosefBauer是否检查函数_aligned_malloc()的结果?因为我在这段代码中没有任何异常。这一行还有一个错误:
\uuuum128i*sourceVOffset=(\uuuum128i*)source+verticalDistance*sourcestride必须将其更改为
uuu m128i*sourceVOffset=(uuu m128i*)((无符号字符*)source+(垂直距离*sourcestride))@ErmIg你说得对,我也必须换成loadu si128。谢谢
__m128i* sourceVOffset = (__m128i*)source + verticalDistance * sourcestride);
__m128i* sourceVOffset = (__m128i*)((char*)source + verticalDistance * sourcestride);