如何使我的代码在多个内核上运行?

时间:2020-03-06 14:37:36  来源:igfitidea点击:

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

更新以获取更多详细信息

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

再次更新

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

解决方案

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

我们可能想看看.NET的并行扩展

http://msdn.com/concurrency

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

我们可能需要阅读Herb Sutter的"有效并发性"专栏。我们将在这里与其他人一起找到这些文章。

我可以概括地说,编写高度优化的多线程进程比仅在混合中投入一些线程要困难得多。

我建议从以下步骤开始:

  • 将工作负载分成离散的并行可执行单元
  • 测量和表征工作负载类型-网络密集型,I / O密集型,CPU密集型等-这些成为工作人员池策略的基础。例如对于网络密集型应用程序,我们可以拥有大量的工作人员池,但是对于CPU密集型任务,拥有比硬件线程更多的工作人员是没有意义的。
  • 考虑排队/数组或者ThreadWorkerPool来管理线程池。前者比后者更能控制细颗粒。
  • 如果可以的话,学会比同步模式更喜欢异步I / O模式-腾出更多的CPU时间来执行其他任务。
  • 努力消除或者至少减少围绕有争议的资源(例如磁盘)的序列化。
  • 最小化I / O,在尽可能短的时间内获取并保持最小级别的锁。 (阅读者/作家锁定是朋友)5.遍历该代码,以确保资源以一致的顺序锁定,以最大程度地减少致命的拥护。
  • 疯狂测试-竞赛条件和多线程应用程序中的错误很难解决-通常我们只会看到大屠杀的法医后果。

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

与线程同步,库等任何详细信息相比,了解要解决的问题,应用程序及其算法中的并行性(或者潜在的并行性)要重要得多。

首先阅读"并行编程模式"(其重点是"发现并发性"和更高级别的设计问题),然后继续阅读"多处理器编程的艺术"(从理论基础出发的实践细节)。