当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何让我的代码在多个核心上运行?》经验,为你挑选了5个好方法。

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

更新了更多细节

C#2.0

在Windows Vista和Windows Server 2003上运行

再次更新

此代码作为服务运行

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

stephbu.. 46

我总结说,编写高度优化的多线程进程要比在混合中抛出一些线程要困难得多.

我建议从以下步骤开始:

    将工作负载拆分为离散的并行可执行单元

    衡量和表征工作负载类型 - 网络密集型,I/O密集型,CPU密集型等 - 这些成为您的工作池合并策略的基础.例如,对于网络密集型应用程序,您可以拥有相当大的工作池,但对于CPU密集型任务而言,拥有更多工作者而不是硬件线程是没有意义的.

    考虑排队/数组或ThreadWorkerPool来管理线程池.前者比后者控制更细粒度.

    如果可以的话,学习优先于同步模式的异步I/O模式 - 释放更多的CPU时间来执行其他任务.

    努力消除或至少减少围绕竞争资源(如磁盘)的序列化.

    最小化I/O,获取并保持最低级别的锁定,以尽可能减少时间.(读者/作者锁定是你的朋友)
    5.通过该代码来确保资源以一致的顺序锁定,以最大限度地减少致命的拥抱.

    像疯了一样进行测试 - 多线程应用程序中的竞争条件和错误对于排除故障是很糟糕的 - 通常你只能看到大屠杀的法医后果.

请记住,多线程版本完全有可能比同一个应用程序的单线程版本更糟糕.良好的工程测量没有任何借口.



1> stephbu..:

我总结说,编写高度优化的多线程进程要比在混合中抛出一些线程要困难得多.

我建议从以下步骤开始:

    将工作负载拆分为离散的并行可执行单元

    衡量和表征工作负载类型 - 网络密集型,I/O密集型,CPU密集型等 - 这些成为您的工作池合并策略的基础.例如,对于网络密集型应用程序,您可以拥有相当大的工作池,但对于CPU密集型任务而言,拥有更多工作者而不是硬件线程是没有意义的.

    考虑排队/数组或ThreadWorkerPool来管理线程池.前者比后者控制更细粒度.

    如果可以的话,学习优先于同步模式的异步I/O模式 - 释放更多的CPU时间来执行其他任务.

    努力消除或至少减少围绕竞争资源(如磁盘)的序列化.

    最小化I/O,获取并保持最低级别的锁定,以尽可能减少时间.(读者/作者锁定是你的朋友)
    5.通过该代码来确保资源以一致的顺序锁定,以最大限度地减少致命的拥抱.

    像疯了一样进行测试 - 多线程应用程序中的竞争条件和错误对于排除故障是很糟糕的 - 通常你只能看到大屠杀的法医后果.

请记住,多线程版本完全有可能比同一个应用程序的单线程版本更糟糕.良好的工程测量没有任何借口.



2> Lou Franco..:

您可能想看一下.NET的并行扩展

http://msdn.com/concurrency



3> Xavier Nodet..:

您可能想阅读Herb Sutter的专栏"Effective Concurrency".你会在这里和其他人一起找到这些文章.



4> Lars Truijen..:

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



5> Chris Wenham..:

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

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有