如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根
Posted
技术标签:
【中文标题】如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根【英文标题】:How to compute the square root of a vector elementwise using vDSP / Accelerate in swift for iOS 【发布时间】:2020-02-04 18:35:22 【问题描述】:我有一个类似于[Float](repeating: 1.0, count: 42000)
的向量,我想使用 Accelerate 框架计算每个元素的平方根,但不存在与Apple Accelerate Framework scale and normalize a vector 中所述相反的vDSP_vsqrt
函数。我该怎么做?
【问题讨论】:
【参考方案1】:vForce Swift 覆盖使语法更简单:
vForce.sqrt(vector: AccelerateBuffer)
看看:https://github.com/apple/swift/blob/master/stdlib/public/Darwin/Accelerate/vForce_Operations.swift
...和...
https://developer.apple.com/videos/play/wwdc2019/718/
【讨论】:
【参考方案2】:看来要调用的正确函数是来自vForce
的vvsqrtf
。
以下是the documentation 的用法示例:
var x: [Float] = [100, 10000, 64, 144]
var y = [Float](repeating: 0, count: x.count)
var n = Int32(x.count)
vvsqrtf(&y, &x, &n)
print(y) // [10.0, 100.0, 8.0, 12.0]
请注意,您还可以“就地”计算平方根:
var data = [Float](repeating: 25.0, count: input.count)
let n = Int32(data.count)
vvsqrtf(&data, data, &n)
【讨论】:
【参考方案3】:我建议制作辅助函数来包装 vvsqrtf
,以公开更 Swift 友好的 API:
import Accelerate
extension Array where Element == Float
func squareRootedElements() -> [Float]
if self.isEmpty return []
var output = Array(repeating: 0, count: self.count)
var count = Int32(self.count)
vvsqrtf(&output, self, &count)
return output
mutating func squareRootElements()
if self.isEmpty return
var count = Int32(self.count)
vvsqrtf(&self, self, &count)
var squares = stride(from: 0 as Float, through: 10, by: +1).map $0 * $0
print(squares)
print(squares.squareRootedElements())
【讨论】:
不需要缓冲区指针,只需vvsqrtf(&output, self, &count)
@JeremyCochoy 哦,如果vvsqrtf
的第一个和第二个参数使用相同的缓冲区,它会就地覆盖吗?
@JeremyCochoy 更新:)
@gasher729 这不是真的。这里产生的唯一开销是函数调用的恒定时间开销,如果您担心,它甚至可以内联。它所做的事情与您自己拨打 vvsqrtf
所做的事情相同,但复制/粘贴更少
此外,您的前提有点误导。您使用加速来加速可并行化操作。它的附加值是它可以在 CPU 或 GPU 中使用 SIMD 指令来加速你的代码,它的加速因子与你的数据大小成正比。它的增值不是消除单个快速函数调用的开销(更不用说这种开销在数据大小上是 O(1) 的事实)。以上是关于如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根的主要内容,如果未能解决你的问题,请参考以下文章
Apple 的 Accelerate vDSP:如何从 FFT 中获取复数向量的参数
Apple Accelerate Framework vDSP_zvmags PACKED 格式?
Apple Accelerate vDSP fft vs DFT 和比例因子
将 AVCaptureAudioDataOutput 数据传递到 vDSP / Accelerate.framework