Apple Accelerate Framework 缩放和规范化矢量

Posted

技术标签:

【中文标题】Apple Accelerate Framework 缩放和规范化矢量【英文标题】:Apple Accelerate Framework scale and normalize a vector 【发布时间】:2010-11-23 00:45:14 【问题描述】:

我可以在Accelerate.framework 中使用哪些函数来按标量缩放向量,并对向量进行归一化?我发现了一个我认为可能适用于文档中的缩放,但我对它的操作感到困惑。

vDSP_vsma
Vector scalar multiply and vector add; single precision.

void vDSP_vsma (
   const float *__vDSP_A,
   vDSP_Stride __vDSP_I,
   const float *__vDSP_B,
   const float *__vDSP_C,
   vDSP_Stride __vDSP_K,
   float *__vDSP_D,
   vDSP_Stride __vDSP_L,
   vDSP_Length __vDSP_N
);

【问题讨论】:

【参考方案1】:

就地规范化向量的最简单方法是

int n = 3;
float v[3] = 1, 2, 3;
cblas_sscal(n, 1.0 / cblas_snrm2(n, v, 1), v, 1);

你需要

#include <cblas.h>

#include <vblas.h>

(或两者兼有)。请注意,有几个函数在对向量进行操作时位于“矩阵”部分。

如果您想使用 vDSP 功能,请参阅Vector-Scalar Division 部分。您可以做几件事:

vDSP_dotpr()sqrt()vDSP_vsdiv() vDSP_dotpr()vrsqrte_f32()vDSP_vsmul()(不过,vrsqrte_f32() 是内置的 NEON GCC,因此您需要检查您是否正在为 armv7 编译)。 vDSP_rmsqv(),乘以 sqrt(n)vDSP_vsdiv()

没有向量归一化函数的原因是因为 vDSP 中的“向量”表示“一次处理很多东西”(最多大约为 4096/8192),并且必须是来自线性代数。对1024-element 向量进行归一化是毫无意义的,而对3-element 向量进行归一化的快速函数并不能显着提高您的应用程序的速度,这就是为什么没有。

vDSP 的预期用途更像是规范化 1024 2- 或 3- 元素向量。我可以找到几种方法来做到这一点:

使用vDSP_vdist() 获取长度向量,后跟vDSP_vdiv()。但是,对于长度大于 2 的向量,您必须多次使用 vDSP_vdist()。 使用vDSP_vsq() 对所有输入求平方,多次使用vDSP_vadd() 将所有输入相加,相当于vDSP_vsqrt()vDSP_vrsqrt(),以及vDSP_vmul()vDSP_vdiv()(视情况而定)。写出 vDSP_vsqrt()vDSP_vrsqrt() 的等价物应该不会太难。 假装输入是复数向量的各种方法。不可能更快。

当然,如果你没有要归一化的 1024 个向量,请不要使事情过于复杂。

注意事项:

    我不使用“2-vector”和“3-vector”以避免与相对论中的“4-vector”混淆。 n 的一个不错的选择是几乎填满您的 L1 数据缓存。这并不难;它们已经相对固定在 32K 大约十年或更长时间(它们可能在超线程 CPU 中的虚拟内核之间共享,并且一些较旧/更便宜的处理器可能有 16K),所以你应该做的最多是 8192用于浮子上的就地操作。您可能希望减少一些堆栈空间,如果您正在执行多个顺序操作,您可能希望将其全部保存在缓存中; 10242048 似乎很明智,任何更多可能会导致收益递减。如果您关心,请衡量绩效...

【讨论】:

好的,谢谢您的信息。我最近看了一个苹果视频,他们说同样的事情,它有利于向量中的数千个元素进行标准化,并且它比普通代码快 10 倍。他们还做了 3 个元素向量,就像我使用的那样,速度快了 2 倍。所以我想我会跳过标准化。感谢您的帮助。 他们做了一个三元素点积;这只是规范化的一步。 @Justin:如果这是您真正想要的功能,请提交错误请求。但是,请注意,没有任何库函数能够击败编写良好的短向量内联操作。 @Stephen:当然不是,但是你的“写得很好的”内联函数必须使用“NEON”指令/向量类型,加上(如果你不介意有一点准确性损失) “快速倒数平方根估计”,比 1/sqrt(x) 快得多。 @tc:我希望您指的是 vrsqrte 指令,而不是通常以该名称命名的可怕黑客。 =)

以上是关于Apple Accelerate Framework 缩放和规范化矢量的主要内容,如果未能解决你的问题,请参考以下文章

Apple 的 Accelerate Framework 库的开源等效项是啥? [关闭]

为什么Apple Accelerate框架有时会很慢?

Apple Accelerate vDSP fft vs DFT 和比例因子

使用 Apple Accelerate Framework vForce 库来提高性能

使用 Apple Accelerate 框架的希尔伯特变换(分析信号)?

如何从链接到 Apple Accelerate 框架的源代码构建 NumPy?