我正在尝试优化两个常量、小尺寸和短类型的 C 样式数组的点积。
我已经阅读了一些有关 SIMD 内在函数的文档以及许多有关使用此内在函数进行点积优化的博客文章/文章。
但是,我不明白使用此内在函数的短数组上的点积如何给出正确的结果。进行点积时,计算值可以(并且在我的情况下总是)大于 SHORT_MAX,因此有总和。因此,我将它们存储在 double 类型的变量中。
据我了解使用 simd 内在函数的点积,我们使用 __m128i 变量类型,并且操作返回 __m128i。那么,我不明白的是为什么它不会“溢出”以及如何将结果转换为可以处理它的值类型?
感谢您的建议
最佳答案
根据数据值的范围,您可能会使用内部函数,例如 _mm_madd_epi16 ,它对 16 位数据执行乘法/加法并生成 32 位项。然后,您需要定期将 32 位项累加到 64 位。您需要执行此操作的频率取决于输入数据的范围,例如如果它是 12 位灰度图像数据,那么您可以在每次迭代 8 个元素(即 512 个输入点)的情况下进行 64 次迭代,然后才可能出现溢出。然而,在最坏的情况下,如果您的输入数据使用完整的 16 位范围,那么您将需要在每次迭代(即每 8 个点)时进行额外的 64 位累加。
关于c++ - SIMD/SSE : short dot product and short max value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28407878/