是否有用于生成带限锯齿波的恒定时间算法?
Is there a constant-time algorithm for generating a bandlimited sawtooth?
我正在研究 GPU 合成音频的可行性,其中每个线程都呈现一个样本。这对可以使用的算法设置了一些有趣的限制 - 任何引用先前样本集的算法都不能以这种方式实现。
过滤就是其中一种算法。带通、低通或高通 - 所有这些都需要查看生成的最后几个样本才能计算结果。这无法完成,因为尚未生成这些样本。
这使得合成带宽受限的波形变得困难。一种方法是使用傅立叶级数对分音进行加法合成。然而,这在 O(n) 时间运行,并且在 GPU 上特别慢,以至于失去了并行性。如果有一种算法在 O(1) 时间 运行,这将消除 b运行ching 并且在处理可听见的 运行ge 时速度提高 1000 倍。
我正在专门为锯齿寻找像 DSF 这样的东西。我一直在尝试手工计算出傅里叶级数的简化,但这真的很难。主要是因为它涉及调和数,也就是黎曼-zeta函数的唯一奇点。
是否可以实现恒定时间算法?如果不是,能否证明不是?
Filtering is one of those algorithms. Bandpass, lowpass, or highpass - all of them require looking to the last few samples generated in order to compute the result. This can't be done because those samples haven't been generated yet.
这是不对的。 IIR滤波器确实需要先前的结果,但FIR滤波器只需要先前的输入;这对于 GPU 的设计目的来说是非常典型的,所以让每个处理核心访问都不太可能是个问题让我们说 64 个输入样本来产生一个输出样本——事实上,Nvidia 和 AMD 使用的缓存架构借他们自己。
Is a constant-time algorithm achievable? If not, can it be proven that it isn't?
是!两个方面:
- 如上所述,FIR 滤波器只需要多个不可变样本输入,因此可以毫无问题地进行大量并行化,并且
- 即使您需要先计算您的输入,并希望对其进行并行化(我看不出这样做的原因——生成锯齿波不受 CPU 限制,但内存带宽受限运行时间。
对您的方法的评论:
I'm looking into the feasibility of GPU synthesized audio, where each thread renders a sample.
从高层的角度来看,这听起来太细粒度了。我的意思是,假设您有 3000 个流处理器(高端消费类 GPU)。假设您的采样率为 44.1kHz,并且假设这些处理器中的每一个只做一个样本,让它们全部 运行 一次只给您 1/14.7 秒的音频(单声道)。然后你必须继续音频的下一部分。
换句话说:样本肯定比处理器多得多。在这些情况下,让一个处理器处理一系列样本通常效率更高;例如,如果你想生成 30 秒的音频,那就是 1.323MS(amples)。简单地将问题分成 3000 个块,每个处理器一个,并为每个处理器提供 44100*30/3000=441 个他们应该处理的样本加上第一个 "own" 样本之前的 64 个 "history" 样本仍然很容易适合本地内存。
又一个想法:
我来自软件定义的无线电背景,其中通常每秒有数百万个样本,而不是实时的几千赫采样率(即处理速度 > 采样率)。尽管如此,在 GPU 上进行计算只为更 CPU 密集的任务付费,因为与 GPU 交换数据的开销很大,而现在 CPUs 的速度非常快。因此,对于您相对简单的问题,与在 CPU 上优化相比,在 GPU 上做事可能永远不会更快;如果您必须同时处理 lots 样本或大量数据流,情况当然会有所不同。对于更细粒度的任务,填充缓冲区、将其移动到 GPU 以及将结果缓冲区返回到您的软件中的问题通常会扼杀优势。
因此,我想挑战你:下载 GNU Radio live DVD,将其刻录到 DVD 或将其写入 U 盘(你也可以 运行 在虚拟机中,但是如果您不知道如何优化您的虚拟器,那当然会降低性能;真的 - 从实时媒体中尝试),运行
volk_profile
让 VOLK library 测试哪些算法在您的特定机器上效果最好,然后启动
gnuradio-companion
然后,运行打开下面两张信号处理流程图:
- "classical FIR":
FIR 滤波器的这种单线程实现在我的 CPU. 上产生了大约 50MSamples/s
- FIR Filter implemented with the FFT, running on 4 threads:
这个实现在我的 CPU 上达到了 160MSamples/s (!!)。
当然,在我 GPU 上的 FFT 的帮助下,我 可以 更快,但这里的问题是:即使使用 "simple" FIR 滤波器,我也可以,使用单个 CPU 内核,从我的机器中获取 50 Megasamples——这意味着,在 44.1kHz 的音频采样率下,我每秒可以处理大约 19 分钟的音频。没有复制进出主机 RAM。没有 GPU 冷却器旋转起来。它可能真的不值得进一步优化。如果您优化并采用 FFT 滤波器方法:160MS/s 意味着每个处理秒大约 一个小时的音频,包括锯齿波生成 。
我正在研究 GPU 合成音频的可行性,其中每个线程都呈现一个样本。这对可以使用的算法设置了一些有趣的限制 - 任何引用先前样本集的算法都不能以这种方式实现。
过滤就是其中一种算法。带通、低通或高通 - 所有这些都需要查看生成的最后几个样本才能计算结果。这无法完成,因为尚未生成这些样本。
这使得合成带宽受限的波形变得困难。一种方法是使用傅立叶级数对分音进行加法合成。然而,这在 O(n) 时间运行,并且在 GPU 上特别慢,以至于失去了并行性。如果有一种算法在 O(1) 时间 运行,这将消除 b运行ching 并且在处理可听见的 运行ge 时速度提高 1000 倍。
我正在专门为锯齿寻找像 DSF 这样的东西。我一直在尝试手工计算出傅里叶级数的简化,但这真的很难。主要是因为它涉及调和数,也就是黎曼-zeta函数的唯一奇点。
是否可以实现恒定时间算法?如果不是,能否证明不是?
Filtering is one of those algorithms. Bandpass, lowpass, or highpass - all of them require looking to the last few samples generated in order to compute the result. This can't be done because those samples haven't been generated yet.
这是不对的。 IIR滤波器确实需要先前的结果,但FIR滤波器只需要先前的输入;这对于 GPU 的设计目的来说是非常典型的,所以让每个处理核心访问都不太可能是个问题让我们说 64 个输入样本来产生一个输出样本——事实上,Nvidia 和 AMD 使用的缓存架构借他们自己。
Is a constant-time algorithm achievable? If not, can it be proven that it isn't?
是!两个方面:
- 如上所述,FIR 滤波器只需要多个不可变样本输入,因此可以毫无问题地进行大量并行化,并且
- 即使您需要先计算您的输入,并希望对其进行并行化(我看不出这样做的原因——生成锯齿波不受 CPU 限制,但内存带宽受限运行时间。
对您的方法的评论:
I'm looking into the feasibility of GPU synthesized audio, where each thread renders a sample.
从高层的角度来看,这听起来太细粒度了。我的意思是,假设您有 3000 个流处理器(高端消费类 GPU)。假设您的采样率为 44.1kHz,并且假设这些处理器中的每一个只做一个样本,让它们全部 运行 一次只给您 1/14.7 秒的音频(单声道)。然后你必须继续音频的下一部分。
换句话说:样本肯定比处理器多得多。在这些情况下,让一个处理器处理一系列样本通常效率更高;例如,如果你想生成 30 秒的音频,那就是 1.323MS(amples)。简单地将问题分成 3000 个块,每个处理器一个,并为每个处理器提供 44100*30/3000=441 个他们应该处理的样本加上第一个 "own" 样本之前的 64 个 "history" 样本仍然很容易适合本地内存。
又一个想法:
我来自软件定义的无线电背景,其中通常每秒有数百万个样本,而不是实时的几千赫采样率(即处理速度 > 采样率)。尽管如此,在 GPU 上进行计算只为更 CPU 密集的任务付费,因为与 GPU 交换数据的开销很大,而现在 CPUs 的速度非常快。因此,对于您相对简单的问题,与在 CPU 上优化相比,在 GPU 上做事可能永远不会更快;如果您必须同时处理 lots 样本或大量数据流,情况当然会有所不同。对于更细粒度的任务,填充缓冲区、将其移动到 GPU 以及将结果缓冲区返回到您的软件中的问题通常会扼杀优势。
因此,我想挑战你:下载 GNU Radio live DVD,将其刻录到 DVD 或将其写入 U 盘(你也可以 运行 在虚拟机中,但是如果您不知道如何优化您的虚拟器,那当然会降低性能;真的 - 从实时媒体中尝试),运行
volk_profile
让 VOLK library 测试哪些算法在您的特定机器上效果最好,然后启动
gnuradio-companion
然后,运行打开下面两张信号处理流程图:
- "classical FIR":
FIR 滤波器的这种单线程实现在我的 CPU. 上产生了大约 50MSamples/s
- FIR Filter implemented with the FFT, running on 4 threads:
这个实现在我的 CPU 上达到了 160MSamples/s (!!)。
当然,在我 GPU 上的 FFT 的帮助下,我 可以 更快,但这里的问题是:即使使用 "simple" FIR 滤波器,我也可以,使用单个 CPU 内核,从我的机器中获取 50 Megasamples——这意味着,在 44.1kHz 的音频采样率下,我每秒可以处理大约 19 分钟的音频。没有复制进出主机 RAM。没有 GPU 冷却器旋转起来。它可能真的不值得进一步优化。如果您优化并采用 FFT 滤波器方法:160MS/s 意味着每个处理秒大约 一个小时的音频,包括锯齿波生成 。