获得两个双精度数组绝对差之和的有效方法

Posted

技术标签:

【中文标题】获得两个双精度数组绝对差之和的有效方法【英文标题】:Efficient way to get the sum of absolute differences of two arrays of doubles 【发布时间】:2013-06-23 02:44:46 【问题描述】:

有没有比在数组元素上执行循环更有效的方法来获取 C/C++ 中 double 的两个 内存块 数组的绝对差之和?所以,我想知道是否有类似memsetmemcpymemcmp 等的函数。

你如何定义差异?

内存块包含double值,我需要的是内存块数组的对应索引中的值之间的绝对数值差之和。

【问题讨论】:

你如何定义差异? 内存块包含双精度值,我需要的是内存块对应索引中的值之间的绝对数值差之和。 如果你在谈论双打你不是在谈论“内存块”,你在谈论数组。 有几个 x86 指令(在 SSE4.1 中)专门用于绝对差之和:M/PSADBW。可悲的是,它们对无符号字节进行操作,而不是双精度数。 【参考方案1】:

是的,有SIMD。如果您使用 GCC,您可以尝试添加 -msse2 -O3 之类的内容,看看它是否会自动为您生成 SIMD 指令。如果是这样,或者如果您选择使用库来执行显式 SIMD,则每条指令可以处理四个浮点数。为了提高您的机会,请尝试使您的内部循环变得简单明了,以便优化器轻松处理它。

【讨论】:

你这里所说的叫做autovectorization。这在很大程度上是一个废话——它偶尔会起作用,但它只适用于简单的循环,高度依赖于编译器版本,并且经常出现错误。 use compiler intrinsics 几乎总是更有效。 如果您要运行的处理器足够新,您可以尝试更强的标志,例如-msse4-mavx

以上是关于获得两个双精度数组绝对差之和的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个整数相除以获得双精度?

数组中数字的绝对差之和

双精度数组上的 SIMD?

如何使用 SSE 指令集绝对 2 个双精度或 4 个浮点数? (最高 SSE4)

leetcode 1438. 绝对差不超过限制的最长连续子数组----双指针篇3,滑动窗口篇2

获得数值型数组的所有元素之和(分别使用增强for循环和普通for循环)