【问题标题】:processor usage (force full usage)处理器使用率(强制完全使用)
【发布时间】:2013-12-28 00:12:46
【问题描述】:

首先,我没有学计算机科学,我自学编程,这么说;

我有一个 C# 程序,它针对非常大的需求曲线运行大量潮流模拟。 我在 Windows 7 下使用带有英特尔 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() 函数调用第三方软件,所以我猜这个第三方软件应该做多线程,不是吗?

【问题讨论】:

  • 您的应用程序是否创建了多个线程?还是一切都在一个线程上?通常一个线程仅限于使用一个 CPU,因此您需要将工作拆分为多个线程。
  • 我使用多线程 (ThreadPool.QueueUserWorkItem(_ => { /*Things*/ }); ) 但我也调用了基于使用 8 个系统线程的第三方软件 COM(我可以看到它在系统监视器中)
  • 更新了我的答案,希望它能为您指明正确的方向。问题在于线程有很多东西要学。如果有任何不清楚的地方,请告诉我。

标签: c# windows multithreading process


【解决方案1】:

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

如果您使用第三方软件进行数据处理,这通常会导致难以拆分为多个线程。通常有用的一种策略是拆分输入数据,然后为每个数据集启动一个新线程。这需要特定领域的知识才能知道您可以拆分什么。对于模拟,一旦您尽可能多地拆分一次运行,另一种方法是并行处理多个运行。

Task Parallel Library 非常有用,可以将您的代码分解为多个线程,而无需进行太多重构。特别是data parallelism 部分。

一个重要的注意事项 - 你需要确保你在做什么是thread-safe。我将为您提供一些进一步的阅读。基本原则是,如果您在线程之间共享数据,那么您需要非常小心它们不会相互影响——这可能会导致奇怪的问题!

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

【讨论】:

    【解决方案2】:

    您应该并行处理这些模拟,以便使用尽可能多的 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.
    

    Data Parallelism (Task Parallel Library)

    【讨论】:

    • 很好的建议,但第三方软件不允许这样做:digApiWrapper.dll 中出现“System.AccessViolationException”类型的第一次机会异常附加信息:尝试读取或写入受保护的内存。这通常表明其他内存已损坏。如果有这个异常的处理程序,程序可以安全地继续。
    • @user3020849 这是合理的。如果您的第 3 方代码运行自己的线程,我的回答是多余的。
    猜你喜欢
    • 2018-06-12
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2017-10-17
    • 2013-05-11
    相关资源
    最近更新 更多