gpt4 book ai didi

ios - Apple Accelerate Framework 缩放和标准化向量

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:24:30 50 4
gpt4 key购买 nike

我可以在 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
);

最佳答案

就地标准化向量的最简单方法是类似

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 元素向量毫无意义,而规范化 3 元素向量的快速函数并不能显着提高您的应用程序的速度,这是为什么没有。

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 个向量,请不要使事情过于复杂。

注意事项:

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

关于ios - Apple Accelerate Framework 缩放和标准化向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251716/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com