Swift SIMD or Accelerate Sum UInt32



是否有一个内置的设施可以加速或其他地方使用加速矢量操作来求和一个UINT32的数组?

我想您想加速

之类的函数
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/master/extra/swift/simdsum

最新更新