代码之家  ›  专栏  ›  技术社区  ›  Community wiki

将所有处理器电源都投入到任务中

  •  3
  • Community wiki  · 技术社区  · 1 年前

    假设我们手头有一个处理器密集型任务,可以有效地并行化。我们怎样才能奉献 全部的 几乎所有 执行该任务的可用处理器功率?

    任务可以是多种多样的,保存记录数字的迭代斐波那契数生成只是一个例子。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Clifford    14 年前

    您可能提供的有关目标环境的详细信息太少。

    通常,当使用RTOS时,您可以禁用中断,以便调度程序和中断服务例程都不会运行,或者您可以应用任务锁定,以便调度器不会运行,但ISR将继续运行。通过将任务的优先级提高到最高优先级,可以实现与任务锁定相同的效果。

    如果你不使用和RTOS(或没有操作系统),你通常无法控制调度,但如果你的线程运行时没有让步(即调用导致线程等待的函数),而其他线程和进程不需要太多周期,你的线程将获得几乎所有的CPU。例如,如果您没有运行其他处理器密集型任务,Windows中的繁忙循环在大多数情况下都会显示为任务监视器中一个核心的100%使用情况。如果你的处理器有多个核心,你必须以某种方式并行化任务,使其使用所有核心。

    I/O调用通常会导致线程阻塞,因此您对“保存”结果的要求可能会导致问题。解决方案是将结果缓冲在内存中(直接或作为队列或写缓存),并将输出推迟到所有计算完成。

        2
  •  0
  •   Delan Azabani    14 年前

    操作系统处理CPU专用性。大多数时候,如果你的程序需要更多的电源,它会得到它,但更高优先级(在Linux中是“不错的”)的进程在CPU时间请求的队列中会更高。

        3
  •  0
  •   TridenT    14 年前

    嗯,这在很大程度上取决于项目的上下文,以及处理器上运行的其他任务是什么。

    考虑一下这些 两个例子 :

    1/处理器只做 一些优先级较低的工作 ,比如说,在USB、CAN、SPI或任何你拥有的通信中,你在计算过程中都不在乎(处理密集型任务),例如,因为通信层等待这个任务的输出。然后,您可以(静态或动态地,取决于您的操作系统)将 非常高的优先级 。您也可以通过任何可用的同步来停止其他任务(消息、任务暂停…)

    2/处理器正在运行 高优先级工作 ,甚至是较小的(看门狗、监管、测量),因此您可以分配任务 优先级较低 因为它需要剩余的微处理器功率,这就足够了!

    所以,也许你会有关于如何为任务分配优先级的问题。。。但这一切都取决于你的固件体系结构,以及你在操作系统还是手动的大“主”之间做出的选择!

    如果您需要准确的答案,请提供更多详细信息。

        4
  •  0
  •   Rostislav Matl    14 年前

    删除所有不必要的过程。

    关闭此进程或其他进程导致的每个磁盘访问和其他阻塞IO。如果你必须这样做,那就晚一点做,批处理。在并行线程中使用多个内核,并设置CPU到进程或内核到进程的相关性可能会有所帮助——最后一个可能是特定于操作系统的。

    将流程设置为高优先级,以便获得更大的份额。