gpt4 book ai didi

c# - .NET 的任务池系统

转载 作者:行者123 更新时间:2023-11-30 14:00:43 27 4
gpt4 key购买 nike

我目前正在编写一个批量处理算法,用于检测从磁盘流式传输的音频中的音高。我已经加强了我的算法,使其几乎实时运行串行流数据。

理想情况下,我希望系统比实时工作得更快,这样我就可以将实时数据交给它,并在不太长的延迟后生成音高轨迹数据。

现在让我印象深刻的是,数据的串行处理是我可以提供大量加速的地方。我在四核 i7(具有 8 个硬件线程)上运行,因此我应该能够通过将处理分散到多个 block 来显着提高速度。

目前我正在做以下事情:

  1. 从磁盘流式传输数据
  2. 缓冲数据,直到我得到我希望分析的窗口大小。
  3. 处理数据窗口。
  4. 将数据复制回 n 个样本(其中 n 是我想要滑动的数量(在 80 毫秒的窗口中这可以低至 1 毫秒!)
  5. 冲洗并重复。

现在让我印象深刻的是,一旦我有了一个窗口,我就可以轻松地将数据复制到给定的线程工作缓冲区(以及提供一个内存位置,结果将被写入)。通过这种方式,我可以有效地缓冲多达 7 个线程(让线程 8 打开以抽取数据)线程池随后将处理的数据。

当我尝试提交第 8 个音频窗口时,我希望池阻塞,直到有线程可用于处理数据等。我的想法是让 7 个线程不断地处理数据。根据以前的经验,我希望看到这样做的速度提高大约 5 倍。

过去我用 C++ 编写了我自己的基于任务的系统,它可以完美地完成工作,但这个应用程序是在 C# 下开发的。为了在 C++ 下以低开销获得良好的并行性,我花费了大量时间构建良好的无锁排队机制。

我非常希望,在 C# 下,有人会为我减轻做这件事的痛苦。但是我找不到任何似乎有用的东西。我查看了 System.Threading.ThreadPool,它似乎无法检查当前有多少线程在运行。更不用说管理费用似乎令人望而却步。然后出现了一个大问题,我不能重新使用现有的预分配结构(这在我的处理中很重要)迫使我每次提交工作项时都重新创建它。这有一个巨大的缺点,那就是我生成工作的速度比我处理它的速度更快,所以我最终不仅浪费了大量时间来设置我真的不应该需要的结构和工作区,而且我的内存使用量也会失控。

然后我发现了 System.Threading.Tasks,但它似乎也没有提供我想要的功能。

我想我可以通过互操作使用我的 C++ 任务管理器,但我真的假设在这个时代有人已经设置了类似的东西。那我错过了什么吗?或者谁能​​给我提供这样一个任务管理引擎的链接?

最佳答案

Task Parallel Library专为您要解决的任务而设计和实现!您也可以通过管道传输此过程。

所以你必须确保:

关于c# - .NET 的任务池系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10018469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com