SSE高效签名的短卷积

时间:2016-08-04 09:29:40

标签: optimization sse convolution avx intel-ipp

我正在尝试在大型签名短图像(1000X1000)上实现定点7X7卷积。 (浮点)内核按比例放大(1 <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 14)以获得有效结果,并将最终结果缩小。

我正在使用SSE实现它。

处理整数向量主要问题是任何乘法函数都会给出部分结果(下/上)或立即缩小结果mulhrs。

为了克服这个问题,我不得不将16位结果转换为32位:

    kernelVec   =   _mm_set1_epi16(kernel); \
    inputVec    =   _mm_srli_epi16(_mm_lddqu_si128(vInput),(shift)); \
    mulLowVec   =   _mm_mullo_epi16(inputVec, kernelVec); \
    mulHighVec  =   _mm_mulhi_epi16(inputVec, kernelVec);\
    sumLeft     =   _mm_add_epi32(sumLeft,  _mm_unpacklo_epi16(mulLowVec, mulHighVec));\
    sumRight    =   _mm_add_epi32(sumRight, _mm_unpackhi_epi16(mulLowVec, mulHighVec)); \

所有这些都是通过单个内核值单个乘以8个元素。

同样如此 - 我尝试将输入数据转换为float并使用avx函数实现它(没有对齐256,所以我必须不断重新加载......):

    kernelVec   =   _mm256_set1_ps(kernel); \
    inputVec    =   _mm256_loadu_ps(fInput); \
    sum         =   _mm256_fmadd_ps(inputVec,kernelVec,sum);\

然后将结果转换回16位短路。 浮动数实现证明比整数1快。

我知道ipp库有ippsConv_16s_Sfs也应该这样做。 有人有什么建议吗?

0 个答案:

没有答案