获得两个双精度数组绝对差之和的有效方法
Posted
技术标签:
【中文标题】获得两个双精度数组绝对差之和的有效方法【英文标题】:Efficient way to get the sum of absolute differences of two arrays of doubles 【发布时间】:2013-06-23 02:44:46 【问题描述】:有没有比在数组元素上执行循环更有效的方法来获取 C/C++ 中 double
的两个 内存块 数组的绝对差之和?所以,我想知道是否有类似memset
、memcpy
、memcmp
等的函数。
你如何定义差异?
内存块包含double
值,我需要的是内存块数组的对应索引中的值之间的绝对数值差之和。
【问题讨论】:
你如何定义差异? 内存块包含双精度值,我需要的是内存块对应索引中的值之间的绝对数值差之和。 如果你在谈论双打你不是在谈论“内存块”,你在谈论数组。 有几个 x86 指令(在 SSE4.1 中)专门用于绝对差之和:M/PSADBW。可悲的是,它们对无符号字节进行操作,而不是双精度数。 【参考方案1】:是的,有SIMD。如果您使用 GCC,您可以尝试添加 -msse2 -O3
之类的内容,看看它是否会自动为您生成 SIMD 指令。如果是这样,或者如果您选择使用库来执行显式 SIMD,则每条指令可以处理四个浮点数。为了提高您的机会,请尝试使您的内部循环变得简单明了,以便优化器轻松处理它。
【讨论】:
你这里所说的叫做autovectorization。这在很大程度上是一个废话——它偶尔会起作用,但它只适用于简单的循环,高度依赖于编译器版本,并且经常出现错误。 use compiler intrinsics 几乎总是更有效。 如果您要运行的处理器足够新,您可以尝试更强的标志,例如-msse4
或-mavx
。以上是关于获得两个双精度数组绝对差之和的有效方法的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SSE 指令集绝对 2 个双精度或 4 个浮点数? (最高 SSE4)