代码之家  ›  专栏  ›  技术社区  ›  Justin Meiners

Apple加速框架规模并规范化向量

  •  3
  • Justin Meiners  · 技术社区  · 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 回复  |  直到 9 年前
        1
  •  5
  •   Regexident Amit Attias    11 年前

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

    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中的“vector”表示“一次处理很多事情”(最多大约 4096 / 8192 )必然是线性代数中的“向量”。规范化 1024 -元素向量和一个用于规范化 3 -元素向量并不能让你的应用程序更快,这就是为什么没有元素向量的原因。

    vDSP的预期用途更像是规范化 一千零二十四 2 -或者 -元素向量。我可以找到一些方法:

    • 使用 vDSP_vdist() 得到一个长度向量 vDSP_vdiv() . 你必须使用 vDSP_vdist() 但是,对于长度大于2的向量,可以多次使用。
    • 使用 vDSP_vsq() 要使所有输入平方, vDSP_vadd() 多次相加,等于 vDSP_vsqrt() vDSP_vrsqrt() ,和 vDSP_vmul() vDSP_vdiv() 视情况而定。写相当于 vDSP_vsqrt() vDSP_vrsqrt() .
    • 各种方式假装你的输入是一个复杂的向量。不太可能更快。

    当然,如果没有1024个向量要规范化,就不要过度复杂。

    笔记:

    1. 我不使用“2矢量”和“3矢量”来避免与相对论中的“4矢量”混淆。
    2. 很好的选择 n个 几乎填满了一级数据缓存。这不难,他们相对固定在 32K 大约10年或更长时间(它们可能在超线程CPU中的虚拟内核之间共享,而一些较旧/较便宜的处理器可能有16K),所以您应该做的最多的是 八千一百九十二 用于浮体上的就地操作。您可能需要减去一点堆栈空间,如果您正在执行多个顺序操作,则可能需要将其全部保存在缓存中; 一千零二十四 2048 看起来相当明智,而且再多的话可能会打击收益递减。如果你在乎,衡量一下表现。。。