c++ - Gnuradio C++ block : high CPU

标签 c++ signal-processing gnuradio

我已经创建了一个 python Gnuradio block ,现在我正在用 C++ 重新编码它。我注意到的是一些非常出乎意料的事情——C++ block (python 流程图过程)比做同样事情的 Python 版本(18%)消耗更多的 CPU(~125%)。我一定是做错了什么......所以 -

我创建了一个没有自定义代码的新 block ,除了将变量类型设置为浮点型,并将输入和输出数设置为 1 外,我看到了相同的行为。我一定做错了什么,但我不知道是什么......

$ gnuradio-config-info -v
3.7.11

Platform: Mac / x86_64

以下是我在现有模块中创建 block 的方式:

$ gr_modtool add -t general donothingcpp
GNU Radio module name identified: acsound
Language (python/cpp): cpp
Language: C++
Block/code identifier: donothingcpp
Enter valid argument list, including default arguments: 
Add Python QA code? [Y/n] n
Add C++ QA code? [Y/n] n
Adding file 'lib/donothingcpp_impl.h'...
Adding file 'lib/donothingcpp_impl.cc'...
Adding file 'include/acsound/donothingcpp.h'...
Editing swig/acsound_swig.i...
Adding file 'grc/acsound_donothingcpp.xml'...
Editing grc/CMakeLists.txt...

这是用于测试的流程图: gnuradio flow graph

我修改了构造函数以指定一个输入和一个输出,然后我调整了 general_work 函数中的变量类型,现在看起来像这样:

int
donothingcpp_impl::general_work (int noutput_items,
                   gr_vector_int &ninput_items,
                   gr_vector_const_void_star &input_items,
                   gr_vector_void_star &output_items)
{
  const float *in = (const float *) input_items[0];
  float *out = (float *) output_items[0];

  // Do <+signal processing+>
  // Tell runtime system how many input items we consumed on
  // each input stream.
  consume_each (noutput_items);

  // Tell runtime system how many output items we produced.
  return noutput_items;
}

无论我是否在 general_work 函数中执行任何操作,该进程的 CPU 占用率大约为 125%。当然,对于每次代码更改,我都会进行清理、制作和安装,以便将 block 放入 gnuradio。如果我添加调试消息,我会在控制台上看到它们,所以我知道我的代码更改在我运行流程图时会被看到和使用。

如果我绕过 donothing block 并运行流程图,它会消耗 0.3% 的 CPU。

我尝试了 null 和 probe 信号接收器,但似乎都不是一个因素。

但是,我无法解释运行自定义 C++ block 时的高 CPU 消耗。

最佳答案

您正在消耗输出样本的数量,但在一般情况下这是错误的(在同步块(synchronized block)情况下是正确的,其中输出项的数量始终与消耗的输入项的数量相同)。

现在,由于您的 block 不检查是否有足够的输入项,它总是被要求运行——因此,CPU 的燃烧。

我觉得你“不小心”制作了一个通用 block (使用 general_work),但打算制作一个同步块(synchronized block)(使用 work)。

关于c++ - Gnuradio C++ block : high CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45013119/

相关文章:

c++ - 如何在多线程中使用模板类型作为槽和信号参数?

c++ - 给定一个字符串,每当你看到单词 "ant"时,将单词 "termite"替换为字符串

audio - Scipy-音频处理

signal-processing - 是否可以使用现有的 1D FFT 算法推导出 2D 逆 FFT 算法?

python - 如何在 gnuradio 中测试源代码块

gnuradio - 有没有办法在 gnuradio 的 block 之间传输矩阵数据?

c++ - 将每个 typedef 放在单独的文件中是好习惯吗?

c++ - 在 DirectX11 游戏上叠加

audio - 吉他和弦识别算法?

signal-processing - 使用GNU Radio进行FSK解调