我目前正在开发一个具有“令人尴尬的并行”场景的应用程序。是否有任何指南/算法来确定理想的任务数量以最大化CPU利用率。
答案 0 :(得分:3)
如果您可以维护多个线程数等于核心数(或者如果启用了超线程,则为两倍),应以最佳方式使用CPU。
此外,相关帖子可能会有所帮助:Optimal number of threads per core。
答案 1 :(得分:3)
我认为最好的方法是首先让框架处理这个问题,并且只有在不够好的情况下才能做更复杂的事情。
在您的情况下,这可能意味着使用Parallel.ForEach()
来处理某些集合,而不是手动使用 n Task
。
如果您发现Parallel.ForEach()
默认设置并未以您希望的方式并行化工作,那么您可以通过设置MaxDegreeOfParallelism
或使用自定义分区程序来尝试摆弄它。 / p>
只有当它仍然不够好时,你应该考虑使用Task
s。
答案 2 :(得分:1)
这取决于你的任务。如果您只是处理并且不等待I / O,那么您应该拥有尽可能多的内核。
向许多不同的服务器发送查询,等待20到40毫秒的响应,从某个磁盘驱动器或磁带录音机读取一些I / O,然后只处理一个ms,每个核心可以服务30个或更多线程。