是否可以将结果存储在 vDSP 框架中的输入向量之一中

Posted

技术标签:

【中文标题】是否可以将结果存储在 vDSP 框架中的输入向量之一中【英文标题】:Is it possible to store the result in one of the input vectors in the vDSP framework 【发布时间】:2012-08-27 08:10:22 【问题描述】:

在 Accelerate Framework 的 vDSP 函数中,所有函数都需要您输入结果向量。如果我不再需要原始输入向量中的任何内容,将输入向量(或输入向量之一)作为结果向量传递是否正确?

我的意思的例子:

vDSP_vsadd(input_vector,1,scalar_addition,input_vector,1,length);

这将采用 input_vector 并将 scalar_addition 添加到所有元素。结果将存储在 input_vector 中。

【问题讨论】:

【参考方案1】:

vDSP 中的简单向量操作都可以就地正常工作(只要它们严格就地;例如,您不能将&input_vector[length/2] 用于输出并期望获得有意义的结果结果)。事实上,就地使用它们通常会提供更好的性能,因为它可以减少缓存压力。

一些更复杂的 vDSP 操作不支持带有一个或多个参数的就地操作;这应该在 vDSP 参考指南中注明。

【讨论】:

我认为'就地'意味着我所描述的 - 输入向量被更改为输出向量?我快速搜索了 vDSP 参考指南,发现文档中出现的唯一一次“就地”是指排序和 fft 算法,这是否意味着更简单的函数不支持“就地”结果向量,还是更简单的功能如此明显地支持“就地”,以至于不需要记录? 是的,“就地”是指您所描述的;它应该为简单的功能明确记录,但不是。 @StephenCanon,您能否参考 vDSP 文档,其中说某些功能对于就地矢量操作是安全的,而有些则不是。我真的很难在文档中找到它。 @ValeriyVan:正如我在你上面的评论中所说,“应该为简单的功能明确记录,但不是。”最接近的是在标题中,在 const 参数下:“如果例程的规范没有说明它改变参数指向的内存,那么例程不会通过那个参数改变那个内存。(它当然可以如果输出参数也指向它,则更改相同的内存。这种就地操作对于某些 vDSP 例程是允许的,而对于其他例程则不允许。)" (ctd) 但是,我在 Accelerate 团队做了 13 年的工程师,我可以确认官方支持就地操作并针对所有简单向量操作进行了测试。

以上是关于是否可以将结果存储在 vDSP 框架中的输入向量之一中的主要内容,如果未能解决你的问题,请参考以下文章

Apple 的 Accelerate vDSP:如何从 FFT 中获取复数向量的参数

是否有用于一维矢量重采样的 vDSP 功能?

如何使用 vDSP / Accelerate in swift for iOS 计算向量元素的平方根

在音频合成方面使用 vDSP(加速框架)

iOS 音频加速

如何在 iOS 中使用 vDSP 将声音文件转换为 FFT