1

背景:我有独立的任务显示为数据流图(永远迭代)。极其简单的例子:
task 1: b1 -> c
task 2: e -> b2

处理器分配已给出。该图本身解释了它们将在其上执行的可用处理器。对于上面的示例,b1 和 b2 在处理器 b 上执行,c 在 c 上执行,e 在 e 上执行。

所有任务的执行时间在编译时是已知的。由于它是循环建模,因此修改了每个任务的最坏情况执行时间以捕获循环调度的资源仲裁。示例:假设最初上面示例中的所有任务都具有执行时间 1。然后我们将时间更改为 b1 和 b2 需要 2 个时间单位,c 和 e 需要 1。这是因为处理器 b 运行以下代码:while(1) { run_task_b1 (); run_task_b2(); 因此,如果我们分析任务 1(吞吐量等),说任务 b1 需要 2 个时间单位,就足以在处理器 b 上共享 b1 和 b2。

我的问题:每个任务都使用额外的资源(DMA)。假设我们有 2 个 DMA。如果我们天真地将 D1 和 D2 分配如下:
b1 得到 D1
c 得到 D2
e 得到 D1
b2 得到 D2
然后在循环建模后 b1 和 b2 得到执行时间 3(因为 b1 与 e 共享 D1,b2 共享处理器 b, 1+1+1 = 3) 并且 c 和 e 获得时间 2(因为 c 与 b2 共享 D2,而 e 与 b1 共享 D1)。所以时间是 3,2,2,3。

但是如果我们将分配分配为: b1 得到 D1
c 得到 D2
e 得到 D2
b2 得到 D1
建模的执行时间是 2,2,2,2。

那么如何制定一种算法来在编译时(静态分配)为给定的任务图找到资源(DMA)分配,从而使建模的 RR 时间最小?如上例所述,列表调度将给出低效的结果。

4

1 回答 1

0

这闻起来像Job Shop Scheduling,它是 NP 完全的。由于您可能没有处理器时间来找到该问题的全局最优值,因此只需将任务放入队列中(按某种任务优先级/难度降序排序)并每次取前一个。这不会是最佳的,但它会很实用:)

此外,您可能想看看work-stealing queues

于 2011-08-15T09:00:46.537 回答