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

时间:2008-09-23 20:52:24

标签: c# multithreading multicore

我在C#中构建了一个应用程序,我希望针对多个内核进行优化。我有一些线索,我应该做更多吗?

更新了更多详情

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

再次更新

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

6 个答案:

答案 0 :(得分:46)

我认为编写高度优化的多线程进程要比在混合中抛出一些线程要困难得多。

我建议从以下步骤开始:

  1. 将您的工作负载拆分为离散的并行可执行单元
  2. 测量和表征工作负载类型 - 网络密集型,I / O密集型,CPU密集型等 - 这些成为您的工作池策略的基础。例如对于网络密集型应用程序,您可以拥有相当大的工作池,但对于CPU密集型任务而言,拥有更多工作者而不是硬件线程是没有意义的。
  3. 考虑排队/数组或ThreadWorkerPool来管理线程池。前者比后者更精细控制。
  4. 如果可以的话,学习优先于同步模式的异步I / O模式 - 释放更多的CPU时间来执行其他任务。
  5. 努力消除或至少减少磁盘等竞争资源的序列化。
  6. 最小化I / O,获取并保持最低级别的锁定,以尽可能减少时间。 (读者/作者锁是你的朋友)
    5.通过该代码进行修改,以确保资源以一致的顺序锁定,以最大限度地减少致命的拥抱。
  7. 像疯了一样进行测试 - 多线程应用程序中的竞争条件和错误很难排除故障 - 通常你只能看到大屠杀的法医后果。
  8. 请记住,多线程版本完全有可能比同一个应用程序的单线程版本更糟糕。没有理由进行良好的工程测量。

答案 1 :(得分:8)

您可能需要查看.NET的并行扩展

http://msdn.com/concurrency

答案 2 :(得分:8)

您可能希望阅读Herb Sutter的专栏“有效并发”。你会发现那些文章here和其他文章。

答案 3 :(得分:6)

为了能够更有效地利用多个内核,您应该将您的工作分成可以并行执行的部分,并使用线程将工作分配到内核上。您可以使用线程,后台工作程序,线程池等

答案 4 :(得分:5)

对于C#,开始学习LINQ方式,然后使用Parallel LINQ库及其.AsParallel()扩展。

答案 5 :(得分:2)

了解您尝试解决的问题中的并行性(或并行性的可能性),您的应用程序及其算法比线程同步,库等的任何细节都重要得多。

首先阅读Patterns for Parallel Programming(重点关注'发现并发'和更高级别的设计问题),然后转到The Art of Multiprocessor Programming(从理论基础开始的实际细节)。