【问题标题】:Would multithreading help a Fast Fourier Transform?多线程会帮助快速傅立叶变换吗?
【发布时间】:2022-10-15 17:29:50
【问题描述】:

我必须通过对项目进行多线程处理来从应用程序中获得性能。到目前为止,我尝试创建一个任务来处理 2048 段音频,并且将为每个段创建该任务以独立运行。但是,这种配置意味着要执行数千个任务,这会导致更多的性能问题,更不用说我找不到将现有递归 FFT 转换为迭代 FFT 以保持分段与任务的 1:1 的方法。 继续尝试这样做有什么好处吗?还是我应该更多地考虑在其他地方优化应用程序。

【问题讨论】:

  • 我敢打赌,如果 FFT 可以是多线程的,那么有一个 nuget 包可以做到这一点。
  • 顺便说一句:您不会使用固定关系段 <=> 任务,而是创建一个工作人员池,这些工作人员不断从列表中获取下一个待办事项并处理它。
  • “通过多线程提高应用程序的性能” - 您应该首先确保现有代码尽可能快。如果您编写代码而不考虑性能,则很可能是震级比它必须要慢。 FFT 是一种常用算法,因此有针对它的高度优化的库。看看 Math.Net 或 intel 性能原语,如果您自己编写 FFT,我猜其中一个会明显更快。
  • @Klamsi 所以基本上将每个 2048 段排队并允许任务/线程提取最旧的可用,处理它,然后将其放入公共输出中,如果我理解你的话
  • @JonasH 会做的,不,我自己没有编写任何代码,这就是我努力解决问题的原因

标签: c# multithreading


【解决方案1】:

在将转换作为串行进程运行时,查看您计算机上的核心使用情况。你的 CPU 用完了吗? 如果没有,那么并行库可以帮助您获得更多的计算能力。

我建议阅读有关 C# 中并行库(程序集)的教程和理论。

【讨论】:

  • 我熟悉 TPL,我也知道我可以获得更高的性能,我的问题在于这样做的方法以及它是否真的会带来好处。我只是问,因为我还没有看到迭代的方法,也没有看到任何多线程实现
【解决方案2】:

我最终选择了 Klamsi 的解决方案(对问题发表了评论)。在进行了更多的清理和错误修复之后,我选择了一种数据结构,该数据结构将被排队,其中包括输出数组中数据的相应索引,以避免结果的顺序错误。 之后的结果(带有输出锁定): 调试顺序:2.1ms 调试多线程:2.6ms 释放顺序:~940ms 发布多线程:~650ms

release 多线程可以在不锁定的情况下达到 500-600 左右。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多