如何让我的代码在多个核心上运行?

19

我使用C#编写了一个应用程序,希望对多核进行优化。我已经使用了一些线程,是否需要再增加?

更详细的更新

  • C# 2.0
  • 在Windows Vista和Windows Server 2003上运行

再次更新

  • 此代码作为服务运行
  • 我不想要完整的代码...... 我的目标是获取您的经验以及如何开始。就像我说过的,我已经使用了线程。还能做什么呢?

我之前问过一个类似的问题,这里是我得到的答案。 - Tom Kidd
6个回答

49

我认为编写高度优化的多线程进程比仅仅添加一些线程要困难得多。

我建议从以下步骤开始:

  1. 将工作负载拆分为离散的并行可执行单元。
  2. 测量和表征工作负载类型-网络密集型、I/O 密集型、CPU 密集型等,这些成为您的工作池策略的基础。例如,您可以为网络密集型应用程序拥有相当大的工作池,但对于 CPU 密集型任务,拥有超过硬件线程的更多工作线程是没有意义的。
  3. 考虑使用队列/数组或 ThreadWorkerPool 来管理线程池。前者比后者更细粒度控制。
  4. 如果您可以,请学习优先使用异步 I/O 模式而不是同步模式-这可以释放更多的 CPU 时间来执行其他任务。
  5. 努力消除或至少减少围绕争用资源(如磁盘)的串行化。
  6. 尽可能地最小化 I/O,获取并保持最低级别的锁定时间。 (读者/写者锁是您的朋友)
    5.通读代码,确保资源以一致的顺序锁定,以最小化死亡拥抱。
  7. 测试像疯子一样-多线程应用程序中的竞争条件和漏洞是极其难以排除的-往往您只能看到屠杀的法庭后果。

请记住,完全有可能多线程版本的性能比同一应用程序的单线程版本差。优秀的工程测量没有借口。


8

8

你可能想要阅读Herb Sutter的专栏“Effective Concurrency”。你可以在这里找到这些文章以及其他相关的文章。


6
为了更有效地利用多个内核,您应将工作分成可以并行执行的部分,并使用线程将工作分配到各个内核上。您可以使用线程、后台工作者、线程池等方式。

只有使用线程,我才能在其他核心上运行吗?其他答案需要Framework 3.5,那么你认为我能用Framework 2.0来做到吗? - Mister Dev
是的,多线程或多进程,在某种程度上来说都是一种线程。而且,是的,.Net 2.0可以使用线程。另外要注意的是,你不需要Thread类就可以利用多个核心,但最终它们都会使用线程。 - Lars Truijens

5

对于C#,开始学习使用LINQ的方式来处理事情,然后利用Parallel LINQ库及其.AsParallel()扩展功能。


2
理解您正在尝试解决的问题、您的应用程序及其算法中的并行性(或潜在并行性)比任何线程同步、库等细节更重要。
首先阅读《并行编程模式》(专注于“寻找并发性”和更高级别的设计问题),然后再阅读《多处理器编程的艺术》(从理论基础开始介绍实践细节)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接