我正在尝试在大型签名短图像(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也应该这样做。 有人有什么建议吗?