核心思路
N 层必须按原顺序切成恰好 K 段非空连续段,每段交给一个 GPU。一段的耗时等于段内各层计算耗时之和;若这段没有覆盖到第 N 层,还要加上这段最后一层的通信耗时 SR,因为下一层在另一个 GPU 上。覆盖到第 N 层的那段没有后继,通信耗时为 0。同一段内部的相邻层不计通信。目标是最小化这 K 段耗时的最大值。
段与段首尾相接,最后一段的起点确定之后,前面是规模更小的同类子问题。用 dp[p][i] 表示前 i 层恰好切成 p 段时,最大段耗时的最小值。枚举最后一段从第 j+1 层开始:
将一个 N 层的深度神经网络按流水线并行部署到 K 个 GPU 上。层必须按从前往后的顺序切成恰好 K 段连续子序列,每段分给一个 GPU,且每段至少包含 1 层。
第 i 层的计算耗时为 Ti,该层输出激活对应的通信耗时为 Si(层号从 1 到 N)。一段若没有覆盖到第 N 层,总耗时等于段内各层计算耗时之和,再加上该段最后一层的通信耗时;同一段内部的相邻层通信耗时为 0。覆盖到第 N 层的那段没有后继层,通信耗时为 0,总耗时只计计算耗时。
请给出一种切分,使 K 个阶段总耗时的最大值最小,并输出这个最小值。
共三行。
第一行是长度为 N 的整数序列 T1,T2,…,TN。
第二行是长度为 N 的整数序列 S1,S2,…,SN,与第一行等长。
第三行是一个整数 K,表示 GPU 数量。
输出一个整数,表示单个 GPU 最大总耗时的最小值。
时间限制:C/C++ 1000 ms,其他语言 2000 ms。
内存限制:C/C++ 512 MB,其他语言 1024 MB。
输入
3 8
6 5
1
输出
11
说明
只有 1 个 GPU,两层必须放在同一阶段。计算耗时为 3+8=11。两层之间没有跨 GPU 的切分,通信耗时为 0,答案是 11。
输入
5 7 4 6 8
3 2 9 6 1
3
输出
14
说明
最优切分是 [1,2]、[3]、[4,5]:
单个 GPU 的最大总耗时为 14。
另一合法切分 [1,2]、[3,4]、[5] 的三段耗时分别是 14、16、8,最大值 16,比 14 更差。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册