关于算法中的任务调度的问题

一直闪光的灯 2016-11-16 04:34:14
我是大二的学生,最近接触到了 一种叫调度的算法,虽然了解了 一二,但是还是不是那么的懂,具体是一道CPU,GPU处理任务时间的问题,完全没思路啊,一点头绪都没有,大家,来看看吧,不知道而没事,能给我看几个关于任务调度的算法题吗,第一次发帖,多多关照。



有若干个任务需要在一台机器上运行。它们之间没有依赖关系,因此 可以被按照任意顺序执行。

该机器有两个 CPU 和一个 GPU。对于每个任务,你可以为它分配不 同的硬件资源:

1. 在单个 CPU 上运行。
2. 在两个 CPU 上同时运行。
3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。

一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中 断,直到执行结束为止。第 i 个任务用单个 CPU,两个 CPU,单个 CPU 加 GPU,两个 CPU 加 GPU 运行所消耗的时间分别为 ai,bi,ci 和 di。

现在需要你计算出至少需要花多少时间可以把所有给定的任务完成,

输入格式

输入的第一行只有一个正整数 n(1 ≤ n ≤ 40), 是总共需要执行的任 务个数。

接下来的 n 行每行有四个正整数 ai, bi, ci, di(ai, bi, ci, di 均不超过 10), 以空格隔开。

输出格式

输出只有一个整数,即完成给定的所有任务所需的最少时间。

输入样例

3

4422

7474

3333

输出样例

7

对样例的解释

有很多种调度方案可以在 7 个时间单位里完成给定的三个任务,以下 是其中的一种方案:

同时运行第一个任务(单 CPU 加上 GPU)和第三个任务(单 CPU), 它们分别在时刻 2 和时刻 3 完成。在时刻 3 开始双 CPU 运行任务 2,在 时刻 7 完成。

...全文
947 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Z-RICHARD 2019-12-02
  • 打赏
  • 举报
回复
引用 3 楼 早打大打打核战争 的回复:
首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU ================================================================================= 这个不对吧,如果上一个任务是 3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。 那么如果它在CPU上运行结束,而GPU还在占用,此时完全可以启动下一个任务在至少一个CPU上运行而不使用GPU。
题目中已说明了一个任务开始执行以后,将会独占它所用到的所有硬件资源,不得中断,直到执行结束为止
Tobi_Obito 2018-08-22
  • 打赏
  • 举报
回复
表示核战争的话都读不懂······
xskxzr 2016-11-30
  • 打赏
  • 举报
回复
引用 2 楼 qq_36727260 的回复:
厉害,感觉这是标准答案吧,基本知道怎么做了,不过最后一句话,是什么意思。感激感激!!
没什么,如果没学过NP复杂性理论的话无视就好。
引用 6 楼 DelphiGuy 的回复:
[quote=引用 4 楼 xsklld 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] 首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU ================================================================================= 这个不对吧,如果上一个任务是 3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。 那么如果它在CPU上运行结束,而GPU还在占用,此时完全可以启动下一个任务在至少一个CPU上运行而不使用GPU。
依题意不会出现这种情况,CPU上运行结束代表程序运行结束,GPU占用也结束了。[/quote] 这逻辑... 假设某任务占用2CPU+GPU,之后在1CPU上执行完毕了,你如何看出来依题意不可以在空闲的那个CPU上启动新任务的情况? [/quote] 因为题目只给了一个参数,按你说的,题目要给3个参数:在两个CPU和GPU上的运行时间。
  • 打赏
  • 举报
回复
引用 4 楼 xsklld 的回复:
[quote=引用 3 楼 DelphiGuy 的回复:] 首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU ================================================================================= 这个不对吧,如果上一个任务是 3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。 那么如果它在CPU上运行结束,而GPU还在占用,此时完全可以启动下一个任务在至少一个CPU上运行而不使用GPU。
依题意不会出现这种情况,CPU上运行结束代表程序运行结束,GPU占用也结束了。[/quote] 这逻辑... 假设某任务占用2CPU+GPU,之后在1CPU上执行完毕了,你如何看出来依题意不可以在空闲的那个CPU上启动新任务的情况?
  • 打赏
  • 举报
回复
有道理。但是依据 第 i 个任务用单个 CPU,两个 CPU,单个 CPU 加 GPU,两个 CPU 加 GPU 运行所消耗的时间分别为 ai,bi,ci 和 di。 可以有: GPU运行时间=ai-ci 或者 bi-di // 差值为0说明不应该给它分配GPU 两CPU占用效率=ai-bi // 差值为0说明应该分配单CPU运行
xskxzr 2016-11-29
  • 打赏
  • 举报
回复
引用 2 楼 qq_36727260 的回复:
厉害,感觉这是标准答案吧,基本知道怎么做了,不过最后一句话,是什么意思。感激感激!!
没什么,如果没学过NP复杂性理论的话无视就好。
xskxzr 2016-11-29
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU ================================================================================= 这个不对吧,如果上一个任务是 3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。 那么如果它在CPU上运行结束,而GPU还在占用,此时完全可以启动下一个任务在至少一个CPU上运行而不使用GPU。
依题意不会出现这种情况,CPU上运行结束代表程序运行结束,GPU占用也结束了。
  • 打赏
  • 举报
回复
首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU ================================================================================= 这个不对吧,如果上一个任务是 3. 在单个 CPU 和 GPU 上同时运行。 4. 在两个 CPU 和 GPU 上同时运行。 那么如果它在CPU上运行结束,而GPU还在占用,此时完全可以启动下一个任务在至少一个CPU上运行而不使用GPU。
一直闪光的灯 2016-11-29
  • 打赏
  • 举报
回复
厉害,感觉这是标准答案吧,基本知道怎么做了,不过最后一句话,是什么意思。感激感激!!
xskxzr 2016-11-16
  • 打赏
  • 举报
回复 2
首先注意到如果一个任务占了两个CPU,那么它运行期间没有其他任务同时运行,它完全可以继续占用GPU。因此为简化问题,可以划去选项2(如果选项2耗时反而比选项4少,可以将选项4的耗时改为选项2的耗时,再划去选项2)。 首先我们声称以下引理: 假设每个任务选择哪个选项是已知的,记A为第一个CPU被占用的时间,B为第二个CPU被占用的时间,C为GPU被占用的时间(比如样例中A=2+4=6,B=3+4=7,C=2+4=6(记得之前的假设,任务2在占用双CPU时,我们假装它也占用了GPU)),那么最少完成时间=max{A,B,C}。 证明:最小完成时间≥max{A,B,C}是显然的,我们只需证最少完成时间≤max{A,B,C},即找合理安排这些任务的运行时间使得完成时间为max{A,B,C}。安排如下: (1)选择选项4的任务最后运行; (2)选择只在第一个CPU上运行的任务从时刻0开始依次不间断地运行,设这些任务一直到时刻t1才结束; (3)选择占用第二个CPU和GPU的任务从时刻0开始依次不间断地运行,设这些任务一直到时刻t2才结束; (4)选择占用第一个CPU和GPU的任务从时刻max{t1,t2}开始依次不间断地运行; (5)选择只占用第二个CPU的任务从时刻t2开始依次不间断地运行。 容易证明以上安排是合法的(即不冲突),且运行时间恰好为max{A,B,C}。 证毕。 基于这个引理,我们只需要关注为每个任务选择哪个选项,而不需要关注具体的分配细节。因此动态规划即可:记f(i,x,y,z)表示在第一个CPU、第二个CPU、GPU分别被占用了x,y,z时间的前提下,前i个工作的最少完成时间,则我们有 f(0,x,y,z)=max{x,y,z}, f(i,x,y,z)=min{f(i-1,x+a[i],y,z), f(i-1,x,y+a[i],z), f(i-1,x+c[i],y,z+c[i]), f(i-1,x,y+c[i],z+c[i]), f(i-1,x+d[i],y+d[i],z+d[i])}. 值得一提的是,这个算法依然只是个伪多项式时间的算法,只是这里a[i],b[i],c[i],d[i]都很小,所以可行。事实上,甚至当m=2,只能选选项1时,原问题也是NP难的,证明留作习题。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧