【问题标题】: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。可悲的是,它们对无符号字节进行操作,而不是双精度数。

标签: c


【解决方案1】:

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

【讨论】:

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