微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C++ 代码中运行内置的八度函数使用 API比在八度中运行该函数花费的时间更长......为什么这样......?

如何解决在 C++ 代码中运行内置的八度函数使用 API比在八度中运行该函数花费的时间更长......为什么这样......?

这是我的 C++ 代码(使用 C++ Octave API),它使用内置的 Octave 函数 filter(),它需要至少 3 个参数作为输入。

#include <iostream>
#include <complex>
#include "/usr/include/octave-4.2.2/octave/builtin-defun-decls.h"

int main (void) {
    int len = 10000000; // 10 millions
    Array<float> filter_taps(dim_vector (1,102),5.55); // # taps = 102
    Array<std::complex<float>> A(dim_vector (1,len),std::complex<float>(0x00,0x00));

    for (octave_idx_type i = 0; i < len; i++)
        A(0,i) = std::complex<float>(1,5);
    
    octave_value_list in;
    in.append(octave_value(filter_taps));
    in.append(octave_value(1));
    in.append(octave_value(A));

    octave_value_list out = Ffilter (in,1);

    A = out(0).complex_array_value();
    return 0;
}

我使用的是 Ubuntu 18.04,我的系统中安装了 Octave,我使用的是 Octave C++ API。

我通过运行 g++ Ffilter.cpp -o Ffilter -loctave -loctinterp 来编译这段代码,并通过 ./Ffilter 执行它。我没有收到任何错误,结果与 Octave 输出完全相同。但执行时间约为9秒。

但是当我在 Octave 中运行等效代码时,执行时间为 2.85 秒。 Octave 代码片段如下所示。

h = 5.55*ones(1,102);
A = ones(1,10000000)+i*5*ones(1,10000000);
A = filter(h,1,A);

由于 Octave 函数本身是用 C/C++ 编写的,而且 C++ 比 Octave 更快。因此,C++ 代码的执行时间应该比 Octave 代码短得多,但情况恰恰相反......

  1. 为什么会这样?我做错了什么?

  2. 有什么方法可以减少使用 C++ (Octave API) 的 filter 函数(内置)的执行时间?如果是这样,请提供演示代码

解决方法

您似乎错过了大 -O

g++ ofilter.cpp -O3 -o Ffilter -loctave -loctinterp

大多数优化在 -O0 或命令行上未设置 -O 级别时完全禁用,即使指定了个别优化标志。 1

然而,对我来说,未优化版本的运行速度与八度一样快。而且八度音程并不比纯优化的 C++ 慢多少。也许你应该在不同的机器上测试它。

八度音阶只有在解释自己的代码时才会变慢。在您发布的脚本中,解释器/虚拟机没有太多工作,它基本上只在内存中移动一些数据,并调用与编译版本相同的长时间运行的 C++ 函数。

看看 profile 函数,如果你使用它,你会看到运行 filter 的八度时间与编译版本运行时大致相同。而C++在这种情况下更快,只是因为在编译版本中数据初始化代码更容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。