3

假设我们手头有一个处理器密集型任务,可以有效地并行化。我们如何才能将所有几乎所有可用的处理器能力都用于执行该任务?

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

4

4 回答 4

3

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

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

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

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

于 2010-05-23T08:46:48.887 回答
0

操作系统处理 CPU 专用性。大多数情况下,如果您的程序需要更多的能力,它会得到它,但更高优先级(Linux 中的“nice”)进程在 CPU 时间请求的队列中会更高。

于 2010-05-22T04:58:45.633 回答
0

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

考虑这两个例子

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

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

因此,也许您会对如何为任务分配优先级有疑问……但这完全取决于您的固件架构以及您在操作系统或大型“主”之间做出的选择!

如果您需要准确的答案,请给我们更多详细信息。

于 2010-05-22T21:19:46.947 回答
0

Remove all unnecessary processes.

Turn off every disk access and other blocking IO caused by this or other process. If you have to do this, do it late, batch it. Using multiple cores in parallel threads and setting CPU-to-process or core-to-process affinity could help - the last one will be probably OS-specific.

Set the process high priority so it gets larger share.

于 2010-05-23T08:59:35.110 回答