首页 > 解决方案 > 我怎样才能使这个功能和 vDSP 版本一样快?

问题描述

我编写了下面的函数,它使用 vDSP 函数调用来计算某个结果。我认为如果我使用 128 位 vFloat 数据类型重写它以避免 vDSP 函数调用,它会更快。但是我的 vFloat 代码仍然比 vDSP 版本慢 2-3 倍。

我主要针对 iOS,但最好是代码在 Mac OS 上也能正常运行。

我在长度为 256 的数组上测量这些函数的速度,这是我的应用程序的典型数组长度。我想知道如何让这个功能尽可能快地运行,因为我有很多其他人喜欢它,我希望一旦我弄清楚如何优化这个功能,我可以对所有其他人使用相同的原则。

这是 vDSP 版本,在 Mac OS 上启用积极优化后速度提高 50%,或者在不积极的编译器设置下速度提高 2-3 倍:

void asymptoticLimitTest2(float limit,
                      const float* input,
                      float* output,
                      size_t numSamples){

        // input / limit => output
        vDSP_vsdiv(input, 1, &limit, output, 1, numSamples);

        // abs(output) => output
        vDSP_vabs(output, 1, output, 1, numSamples);

        // 1 + output => output
        float one = 1.0;
        vDSP_vsadd(output, 1, &one, output, 1, numSamples);

        // input / output => output
        vDSP_vdiv(output, 1, input, 1, output, 1, numSamples);
}

这是我的 vFloat 版本,我认为它会更快,因为它避免了所有函数调用,但对于我的应用程序的标准向量长度 256,它并不更快:

    void asymptoticLimitTest3(float limit,
                              const float* input,
                              float* output,
                              size_t numSamples){

    vFloat limitv = {limit, limit, limit, limit};
    vFloat onev = {1.0,1.0,1.0,1.0};

    size_t n = numSamples;
    // process in chunks of 8 samples
    while(n > 4){
        vFloat d = vfabsf(*(vFloat *)input / limitv) + onev;
        *(vFloat *)output = *(vFloat *)input / d;

        input += 4;
        output += 4;
        n -= 4;
    }

    // process the remaining samples individually
    while(n > 0){
        float d = fabsf(*input / limit) + 1.0;
        *output = *input / d;

        input++;
        output++;
        n--;
    }
}

我希望让 asymptoticLimitTest3() 比 asymptoticLimitTest2() 运行得更快。我很想听听任何可以加快 asymptoticLimitTest3() 的建议

在此先感谢您的帮助。

标签: vectorizationllvm-clangvdsp

解决方案


我对时序进行了更多测试,结果发现 vFloat 版本通常不会比 vDSP 版本慢。当我进行原始测试时,我在 for 循环中一遍又一遍地调用相同的函数来获取时间信息。当我重写循环以便将调用与对其他函数的调用交错时(这对于实际应用程序来说更正常),那么 vFloat 版本会更快。显然,vDSP 版本从重复运行相同的代码中获得了一些好处,这可能是因为代码本身保留在缓存中。


推荐阅读