Swift SIMD 或加速总和 UInt32
Swift SIMD or Accelerate Sum UInt32
是否有内置的 Accelerate 工具或其他地方使用加速矢量运算对 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/extra/swift/simdsum
是否有内置的 Accelerate 工具或其他地方使用加速矢量运算对 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/extra/swift/simdsum