处理器使用情况(强制使用)

首先,我没有学习计算机科学,而是教我编程自己,说;

我有一个C#程序,运行大功率stream模拟非常大的需求configuration文件。 我在windows 7下使用带有intel i7处理器(4核心 – > 8线程)的笔记本电脑。当我运行模拟时,处理器消息是32%。

我已经阅读了关于进程优先级的其他线程,而且我已经或多或less清楚地知道,当在OS​​上运行时,它全速运行,但操作系统保持接口响应(这是正确的吗?

那么我想用模拟“完全淹没处理器” 获得100%的使用率(如果可能的话)?

提前致谢。

参考#1: 有没有办法限制在c#中的API的处理器资源?

Ref#2: 多个处理器和PerformanceCounter C#

编辑:删除不相关的东西后调用模拟的一段代码

while ( current_step < sim_times.Count ) { bool repeat_all = false; power_flow( sim_times[current_step] ); current_step++; } 

我知道这是非常简单的,这是一段时间,因为在原来的代码,我可能要重复一定数量的步骤。

power_flow()函数调用第三方软件,所以我猜这是第三方软件应该做multithreading的软件,不是吗?

你不能真正强制完全使用 – 你需要为处理器提供更多的工作。 你可以通过增加线程数来并行处理更多的数据。 如果您提供源代码的示例,我们可以提供关于如何更改代码来实现此目的的具体建议。

如果您使用第三方软件进行数据处理,这通常很难分成多个线程。 一种常用的策略是将输入数据分开,然后为每个数据集启动一个新的线程。 这需要特定领域的知识来了解您可以分离的内容。 对于模拟,一旦你尽可能地分开一个运行,一个替代方案是并行处理多个运行。

任务并行库可以真正有用的分解成多个线程没有太多的重构你的代码。 特别是数据并行部分。

谨慎的一个注意事项 – 你需要确保你在做什么是线程安全的 。 我会为你提供一些进一步的阅读。 基本的原则是,你需要确保你是否在线程之间共享数据,那么你需要非常小心,不要互相影响 – 这可能会导致奇怪的问题!

至于你关于接口的问题 – 在你的进程中你可以为每个线程分配线程优先级。 接口线程就像其他任何线程一样。 通常UI线程被赋予最高的优先级以保持响应,而长的后台进程被赋予正常/低于正常的优先级,因为它可以在空闲时间被处理。 您可以手动设置优先级,任何新线程的默认值为“正常”。

您应该并行处理这些模拟,以便尽可能多地使用CPU。 通过为每个模拟运行创建一个Task来做到这一点。

 using System.Threading.Tasks; ... List<Task> tasks = new List<Task>(); for(;current_step < sim_times.Count; current_step++) { var simTime = sim_times[current_step]; //extract the sim parameter Task.Factory.StartNew(() => power_flow(simTime)); //create a 'hot' task - one that is immediately scheduled for execution } Task.WaitAll(tasks.ToArray()); //wait for the simulations to finish so that you can process results. 

数据并行(任务并行库)