首先,我没有学习计算机科学,而且我教我自己编程,说;
我有一个C#程序,可以针对非常大的需求配置文件运行大量的潮流模拟。 我在Windows 7下使用带有intel i7处理器(4核 - > 8线程)的笔记本电脑。 当我运行模拟时,处理器消息大约是32%。
我已经阅读了有关流程优先级的其他主题,我或多或少地明白,当某些东西在操作系统上运行时,它会全速运行,但操作系统会保持接口响应(这是正确的吗?)
我想用模拟“彻底淹没处理器”;得到100%的使用率(如果可能的话)?
提前致谢。
参考#1:Is there a way of restricting an API's processor resource in c#?
参考#2:Multiple Processors and PerformanceCounter C#
编辑:删除不相关内容后调用模拟的代码片段while ( current_step < sim_times.Count ) {
bool repeat_all = false;
power_flow( sim_times[current_step] );
current_step++;
}
我知道它非常简单,而且还有一段时间,因为在原始代码中我可能想重复一定数量的步骤。
power_flow()
函数调用第三方软件,所以我猜这个第三方软件是应该进行多线程处理的软件,不是吗?
答案 0 :(得分:3)
您无法真正强制使用 - 您需要为处理器提供更多工作。您可以通过增加并行处理更多数据的线程数来实现此目的。如果您提供源代码示例,我们可以提供有关如何更改代码以实现此目的的具体建议。
如果您使用第三方软件进行数据处理,这通常会使分割成多个线程变得困难。一种常用的策略是分割输入数据,然后为每个数据集启动一个新线程。这需要特定领域的知识来了解您可以拆分的内容。对于模拟,一旦你尽可能地分开一次运行,另一种方法就是并行处理多次运行。
Task Parallel Library对于将代码分解为多个线程而没有太多重构非常有用。特别是data parallelism部分。
需要注意的一点 - 你需要确保你所做的是thread-safe。我会为你提供一些进一步的阅读。基本原则是你需要确保你是否在线程之间共享数据然后你需要非常小心它们不会相互影响 - 这可能会导致奇怪的问题!
关于接口的问题 - 在您的过程中,您可以为每个线程分配线程优先级。接口线程就像任何其他线程一样。通常,UI线程被赋予最高优先级以保持响应,而长后台进程被赋予正常/低于正常优先级,因为它可以在空闲时间期间被处理。您可以设置优先级manually,任何新线程的默认值都是正常。
答案 1 :(得分:0)
您应该并行处理这些模拟,以便尽可能多地使用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.