【问题标题】:reserving all processor resources, Core and Cache [closed]保留所有处理器资源,核心和缓存[关闭]
【发布时间】:2014-02-21 23:32:55
【问题描述】:

我是一名计算机科学专业的学生,​​致力于自学算法。我现在正在研究的算法必须在功能强大的 PC 上运行大约两个月才能产生任何有用的东西,因此处理器效率会产生很大的不同。大部分处理器时间将用于运行具有不同初始值的子进程。

理想情况下,我希望在单独的线程上运行其中的几个子进程,为每个线程保留一个内核和部分缓存约一小时。在那一小时之后,我可以让操作系统有时间运行其他进程,并检查用户输入。一旦完成,我想再次保留所有资源一个小时。

有没有一种简单的方法可以做到这一点,如果没有,是否值得做(性能提高 5%-10% 值得将编程时间加倍),如果值得做但是很难有什么资源来计算它出来了吗?

我对 C++ JAVA 很熟悉,必要时可以做 C#

【问题讨论】:

  • 您的目标操作系统是什么?如果机器处于静止状态,这样做的改进可能远低于 1%。
  • 您确定要在一个问题中询问所有这些语言吗?这太宽泛了:c#、java 和 c++ 非常不同,并且有多种技术可以为它们中的每一个处理多线程。

标签: c# java c++ multithreading caching


【解决方案1】:

没有现代 CPU 的缓存是由用户模式软件控制的,即使不是这种情况,通过尝试“在进入操作系统时禁用缓存”或类似的方法来提高性能也不会有任何运气想法。

同样,除了可能对每个进程/线程使用处理器亲和性之外,“锁定 CPU 资源”没有任何意义。

在现代系统中,操作系统的开销是最小的,只要系统没有运行xgears 或类似“屏幕保护程序”的东西。关闭它,您的应用程序应该会获得 99.9% 的 CPU 性能。

如果您想从系统中获得更高的性能,您最好查看编译器生成的代码,选择对您的问题有效的算法等。显然,使用分析器来识别“热点”你的申请。

【讨论】:

    【解决方案2】:

    虽然有一些方法可以将运行线程的优先级设置为“高”,但也许您应该考虑不同的整体策略。您的问题描述意味着您将进行多个独立的计算(“一个具有不同初始值的子过程”)。也许您应该考虑将计算分解为“子工作单元”,将初始值和结果存储在数据库中......并招募其他学生在空闲时间在他们的计算机上运行这些子工作单元。

    对于您使用的计算机,请尝试创建多线程(许多笔记本电脑通过多核和超线程具有相当于 8 个 CPU)。

    【讨论】:

      【解决方案3】:

      这个问题模棱两可。让我解释一些关于加快代码速度的选项,因为您似乎主要关心这一点。

      1. 如果您有多核处理器,请使用 C# 4.0 附带的并行编程或使用 MPI 或 OpenMP
      2. 您可以使用许多并行化技术来提高处理速度,例如平铺等,具体取决于问题
      3. 确保每个线程或进程是独立的,例如将日志文件分开等,以便每个线程可以独立运行。
      4. 确保所有线程都具有高优先级
      5. 如果您的内存超过 4GB,请将您的程序设为 64 位应用程序
      6. 增加系统时钟周期
      7. 为进程增加 RAM 内存(例如,如果您有 4GB 内存,但并非所有 4GB 都被进程使用,则应该有选项来控制它,具体取决于您的操作系统。
      8. 如果您知道防病毒等任何进程,请使用http://www.maketecheasier.com/limit-app-cpu-usage-in-windows/ 来限制他们的 CPU 访问权限
      9. 使用缓存分析并尝试改进您的代码。
      10. 有一些超级计算中心,如果您需要更多能力,请联系他们并请求集群节点 - 您可能会走运!

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多