Implement utilization analysis for separate and fused kernel timelines. Merge touching or overlapping busy intervals independently per streaming multiprocessor. For N processors, makespan T, and merged busy time Tbusy,s:
U=NT∑sTbusy,s.For each processor, idle tail is makespan minus its final positive-work end, or the full makespan when it did no work. Return a dictionary with separate metrics, fused metrics, and relative_makespan_speedup. Two empty timelines have speedup one.
Input: separate_intervals = [[0,0,4],[0,2,6],[1,1,3]], fused_intervals = [[0,0,3],[1,0,3]], separate_sm_count = 2, fused_sm_count = 2
Output: {"separate":{"makespan":6,"busy_time":8,"utilization":0.666667,"idle_tails":[0,3]},"fused":{"makespan":3,"busy_time":6,"utilization":1,"idle_tails":[0,0]},"relative_makespan_speedup":2}
Explanation: The two overlapping intervals on processor zero merge into one six-unit busy interval.
Input: separate_intervals = [[0,1,3]], fused_intervals = [[0,1,3]], separate_sm_count = 3, fused_sm_count = 3
Output: {"separate":{"makespan":3,"busy_time":2,"utilization":0.222222,"idle_tails":[0,3,3]},"fused":{"makespan":3,"busy_time":2,"utilization":0.222222,"idle_tails":[0,3,3]},"relative_makespan_speedup":1}
Input: separate_intervals = [], fused_intervals = [], separate_sm_count = 2, fused_sm_count = 3
Output: {"separate":{"makespan":0,"busy_time":0,"utilization":0,"idle_tails":[0,0]},"fused":{"makespan":0,"busy_time":0,"utilization":0,"idle_tails":[0,0,0]},"relative_makespan_speedup":1}
Sort and merge intervals independently for each processor.
Derive utilization and idle tails from merged ranges.
Accepts: array
Accepts: array
Accepts: number
Accepts: number
Implement utilization analysis for separate and fused kernel timelines. Merge touching or overlapping busy intervals independently per streaming multiprocessor. For N processors, makespan T, and merged busy time Tbusy,s:
U=NT∑sTbusy,s.For each processor, idle tail is makespan minus its final positive-work end, or the full makespan when it did no work. Return a dictionary with separate metrics, fused metrics, and relative_makespan_speedup. Two empty timelines have speedup one.
Input: separate_intervals = [[0,0,4],[0,2,6],[1,1,3]], fused_intervals = [[0,0,3],[1,0,3]], separate_sm_count = 2, fused_sm_count = 2
Output: {"separate":{"makespan":6,"busy_time":8,"utilization":0.666667,"idle_tails":[0,3]},"fused":{"makespan":3,"busy_time":6,"utilization":1,"idle_tails":[0,0]},"relative_makespan_speedup":2}
Explanation: The two overlapping intervals on processor zero merge into one six-unit busy interval.
Input: separate_intervals = [[0,1,3]], fused_intervals = [[0,1,3]], separate_sm_count = 3, fused_sm_count = 3
Output: {"separate":{"makespan":3,"busy_time":2,"utilization":0.222222,"idle_tails":[0,3,3]},"fused":{"makespan":3,"busy_time":2,"utilization":0.222222,"idle_tails":[0,3,3]},"relative_makespan_speedup":1}
Input: separate_intervals = [], fused_intervals = [], separate_sm_count = 2, fused_sm_count = 3
Output: {"separate":{"makespan":0,"busy_time":0,"utilization":0,"idle_tails":[0,0]},"fused":{"makespan":0,"busy_time":0,"utilization":0,"idle_tails":[0,0,0]},"relative_makespan_speedup":1}
Sort and merge intervals independently for each processor.
Derive utilization and idle tails from merged ranges.
Accepts: array
Accepts: array
Accepts: number
Accepts: number