c++ - SIMD/SSE : short dot product and short max value

标签 c++ x86 sse simd intrinsics

我正在尝试优化两个常量、小尺寸和短类型的 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/

相关文章:

C++ 将变量传递给 System() WINAPI(无 MFC)

c++ - AVX2 float 比较并得到 0.0 或 1.0 而不是全 0 或全 1 位

c++ - C++ 数组初始化的目的是什么?

c - 为什么在 MASM Assembly 中使用 FPU x87 指令集执行操作时会得到无意义的数字?

assembly - 我可以在 gdb 下打印 gdtr 和 gdt 描述符吗?

assembly - 在汇编程序中交换最高有效字节和最低有效字节

c++ - 如何使用SSE2实现8bit madd

vectorization - Xeon Phi 上的 loaddup_pd/unpacklo_pd

C++ 如何在两个不同项目中的静态变量之间发生链接

c++ - 以 C++ 方式格式化文本