是否有一个内置的设施来加速或在其他地方使用加速向量操作对一个UInt32数组进行求和?
发布于 2016-12-22 16:23:12
我认为您希望加速一个函数,例如
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]
}然而,让我们来看看为第一个功能所产生的装配.
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中的SIMD指令手动设计和函数,那么您可能是在浪费时间…编译器将自动为您完成这项工作。
请参阅https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/swift/simdsum上的进一步代码
https://stackoverflow.com/questions/41257678
复制相似问题