Swift SIMD 或 Accelerate Sum UInt32

Posted

技术标签:

【中文标题】Swift SIMD 或 Accelerate Sum UInt32【英文标题】:Swift SIMD or Accelerate Sum UInt32 【发布时间】:2016-12-21 07:50:37 【问题描述】:

是否有用于 Accelerate 或其他地方的内置工具,用于使用加速向量运算对 UInt32 数组求和?

【问题讨论】:

据我从***.com/questions/5567517/… 了解到,没有这样的函数可以直接对整数数组进行操作。 【参考方案1】:

我想你想加速一个功能,比如

func scalarsum (_ test_array: [UInt32]) -> UInt32 
   var result : UInt32 = 0
   for x in test_array 
     result = result &+ x
   
   return result

所以也许你可以写一些复杂的东西……

func simdsum (_ test_array: [UInt32]) -> UInt32 
   var tmpvector=uint4(0)
   // assume test_array.count is divisible by four
   let limit = test_array.count/4
   for i in 0..<limit 
     let thisvector = uint4(test_array[4*i],test_array[4*i+1],test_array[4*i+2],test_array[4*i+3])
     tmpvector = tmpvector &+ thisvector
   
   return tmpvector[0] + tmpvector[1] + tmpvector[2] + tmpvector[3]

不过,让我们看看 swift 为第一个函数生成了什么...

simdsum[0x100001070] <+448>: movdqu 0x20(%rcx,%rdi,4), %xmm2 simdsum[0x100001076] <+454>: movdqu 0x30(%rcx,%rdi,4), %xmm3 (...) simdsum[0x10000107c] <+460>: paddd %xmm2, %xmm0 simdsum[0x100001080] <+464>: paddd %xmm3, %xmm1

啊!啊! Swift 足够聪明,可以将总和向量化。

所以简短的回答是,如果您尝试在 Swift 中使用 SIMD 指令手动设计求和函数,您可能是在浪费时间……编译器会自动为您完成这项工作。

在https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/swift/simdsum查看更多代码

【讨论】:

编译器也会对array.reduce(0, &amp;+)进行向量化;我认为甚至没有太多理由编写函数。 ?(也就是说,可以比编译器更好地处理对齐和边缘;如果您的数组通常很小,这将产生显着的加速,但代价是编写显式矢量代码。对于典型的长度 > 128 左右,差异将是最小的)。 “我认为没有太多理由去写一个函数。” -> 点了​​,但是,当然,这与我所说的并不矛盾。

以上是关于Swift SIMD 或 Accelerate Sum UInt32的主要内容,如果未能解决你的问题,请参考以下文章

为什么Apple Accelerate框架有时会很慢?

OSX Accelerate 框架上浮动选择的 4 路 SIMD 版本是啥?

来自 UIImage 或来自文件的 vImage - Swift 和 Accelerate 框架

在 Swift 中使用 Accelerate 框架

使用 Swift 中的 Accelerate 框架来自 AVAudioPCMBuffer 的频谱图

在 Swift 中使用 Accelerate Framework 复数支持