我正在尝试优化两个c型样式的点和小尺寸点类型的点积。

我已经阅读了一些有关SIMD内在函数的文档,以及许多有关使用此insincs优化点积的博客文章/文章。

但是,我不明白使用此内在函数的短数组上的点积如何能给出正确的结果。在制作点积时,计算值可以(并且在我的情况下始终大于)SHORT_MAX,因此总和也是如此。因此,我将它们存储在double类型的变量中。

当我了解使用simd内在函数的点积时,我们使用__m128i变量类型,并且操作返回__m128i。所以,我不明白的是为什么它不“溢出”,以及如何将结果转换为可以处理的值类型?

谢谢你的建议

最佳答案

根据数据值的范围,您可以使用诸如_mm_madd_epi16之类的内部函数,该函数对16位数据执行乘法/加法运算并生成32位项。然后,您需要定期将32位项累积到64位。您需要多久执行一次操作取决于输入数据的范围,例如如果是12位灰度图像数据,则可以在可能发生溢出之前以8个元素(即512个输入点)进行64次迭代。但是,在最坏的情况下,如果您的输入数据使用完整的16位范围,那么您将需要在每次迭代时(即每8点)进行额外的64位累加。

关于c++ - SIMD/SSE:短点积和最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28407878/

10-14 07:10