首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sum或加速求和UInt32

Sum或加速求和UInt32
EN

Stack Overflow用户
提问于 2016-12-21 07:50:37
回答 1查看 517关注 0票数 1

是否有一个内置的设施来加速或在其他地方使用加速向量操作对一个UInt32数组进行求和?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-22 16:23:12

我认为您希望加速一个函数,例如

代码语言:javascript
复制
func scalarsum (_ test_array: [UInt32]) -> UInt32 {
   var result : UInt32 = 0
   for x in test_array {
     result = result &+ x
   }
   return result
}

所以也许你可以写一些像这样复杂的东西..。

代码语言:javascript
复制
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上的进一步代码

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41257678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档