【问题标题】:Is there a constant-time algorithm for generating a bandlimited sawtooth?是否有用于生成带限锯齿的恒定时间算法?
【发布时间】:2015-12-31 05:12:21
【问题描述】:

我正在研究 GPU 合成音频的可行性,其中每个线程渲染一个样本。这对可以使用哪些算法提出了一些有趣的限制——任何引用先前样本集的算法都不能以这种方式实现。

过滤是其中一种算法。带通、低通或高通——所有这些都需要查看生成的最后几个样本以计算结果。无法执行此操作,因为这些样本尚未生成。

这使得合成带限波形变得困难。一种方法是使用傅立叶级数对部分进行加法合成。然而,这在 O(n) 时间运行,并且在 GPU 上特别慢,以至于失去了并行性的增益。如果有一个算法在 O(1) 时间运行,这将消除分支,并且在处理可听范围时速度提高 1000 倍。

我正在专门寻找用于锯齿的 DSF 之类的东西。我一直在尝试手动简化傅立叶级数,但这真的非常非常难。主要是因为它涉及调和数,也就是 Riemann-Zeta 函数的唯一奇点。

是否可以实现恒定时间算法?如果不是,能证明不是吗?

【问题讨论】:

  • 如果您在此处没有得到好的答案,请考虑将此问题移至 dsp.stackexchange.com。

标签: algorithm parallel-processing signal-processing gpgpu audio-processing


【解决方案1】:

过滤是其中一种算法。带通、低通或高通——所有这些都需要查看生成的最后几个样本以计算结果。无法执行此操作,因为这些样本尚未生成。

这是不对的。 IIR 过滤器确实需要先前的结果,但 FIR 过滤器只需要先前的输入;这对于 GPU 被设计用来做的事情来说是非常典型的,所以让每个处理核心访问假设 64 个输入样本来产生一个输出样本不太可能是个问题——事实上,Nvidia 和 AMD 使用的缓存架构借他们自己。

是否可以实现恒定时间算法?如果不是,能证明不是吗?

是的!分两个方面:

  1. 如上所述,FIR 滤波器只需要不可变输入的多个样本,因此它们可以大量并行化而不会出现问题,并且
  2. 即使您需要先计算输入,并希望将其并行化(我看不出原因——生成锯齿不受 CPU 限制,但内存带宽有限),每个内核都可以简单地计算最后的 N 个样本——当然,有 N-1 个冗余操作,但只要你的核心数量比你的 N 大得多,你仍然会更快,并且每个核心都会有恒定的运行时间。

对您的方法的评论:

我正在研究 GPU 合成音频的可行性,其中每个线程渲染一个样本。

从高层的角度来看,这听起来太细了。我的意思是,假设你有 3000 个流处理器(高端消费 GPU)。假设您的采样率为 44.1kHz,并且假设这些处理器中的每一个只进行一次采样,那么让它们都运行一次只会给您 1/14.7 秒的音频(单声道)。然后您必须继续进行音频的下一部分。

换句话说:样本肯定比处理器多得多。在这些情况下,让一个处理器处理一系列样本通常效率更高。例如,如果你想生成 30 秒的音频,那就是 1.323 毫秒(amples)。只需将问题分成 3000 个块,每个处理器一个块,并为每个块提供 44100*30/3000=441 个他们应该处理的样本加上 64 个“历史”样本,然后它们的第一个“自己的”样本仍然很容易拟合到本地内存中。

又一个想法:

我来自软件定义的无线电背景,通常每秒有数百万个样本,而不是几 kHz 的实时采样率(即处理速度 > 采样率)。尽管如此,在 GPU 上进行计算只会为 CPU 密集型任务付出代价,因为与 GPU 交换数据的开销很大,而且现在的 CPU 速度非常快。因此,对于您相对简单的问题,与在 CPU 上优化它们相比,在 GPU 上做事可能永远不会更快;如果您必须同时处理 大量 个样本或大量流,事情当然看起来会有所不同。对于更细粒度的任务,填充缓冲区、将其移动到 GPU 并将结果缓冲区返回到您的软件中的问题通常会扼杀优势。

因此,我想挑战您:下载GNU Radio live DVD,将其刻录到 DVD 或将其写入 USB 记忆棒(您也可以在 VM 中运行它,但如果您这样做当然会降低性能不知道如何优化您的虚拟器;真的 - 从现场媒体中尝试),运行

volk_profile

VOLK library 测试哪些算法在您的特定机器上最有效,然后启动

gnuradio-companion

然后,运行打开以下两个信号处理流程图:

  1. "classical FIR":
    这种 FIR 滤波器的单线程实现在我的 CPU 上产生了大约 50MSamples/s。
  2. FIR Filter implemented with the FFT, running on 4 threads:
    仅在我的 CPU 上,这个实现就达到了 160MSamples/s (!!)。

当然,在我的 GPU 上的 FFT 的帮助下,我可以更快,但这里的问题是:即使使用“简单”的 FIR 滤波器,我也可以使用单个 CPU 内核,从我的机器中获取 50 兆样本——这意味着,以 44.1kHz 的音频采样率,每秒钟我可以处理大约 19 分钟的音频。没有复制进出主机 RAM。没有 GPU 冷却器旋转。可能真的不值得进一步优化。如果您优化并采用 FFT 滤波器方法:160MS/s 意味着大约每秒处理一小时的音频,包括锯齿波生成

【讨论】:

  • 假设我想将 GPU 用于类似 DAW 的环境。现在,例如,FL Studio 在它可以使用多少 CPU 方面非常有限——当我在八核机器上的总 CPU 使用率为 15% 时,我会得到弹出和点击。这可能意味着它对某些事情(可能包括 GUI)使用并行编程,但将大部分工作放在一个内核上。显然这与使用 GPU 生成单个锯齿有很大不同——这里有收获吗?
  • “CPU 负载为 15% 时弹出和点击”听起来处理的 延迟 太高,而 CPU 消耗 不太高。将东西复制到 GPU 很可能会让事情变得更糟!
猜你喜欢
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多