@@ -503,9 +503,9 @@ func parseCPUMetrics(powermetricsOutput string, cpuMetrics CPUMetrics) CPUMetric
503503 residencyRe := regexp .MustCompile (`(\w+-Cluster)\s+HW active residency:\s+(\d+\.\d+)%` )
504504 frequencyRe := regexp .MustCompile (`(\w+-Cluster)\s+HW active frequency:\s+(\d+)\s+MHz` )
505505
506- const numReadings = 5
507- var pClusterReadings []int
508- var pClusterFreqReadings []int
506+ // const numReadings = 5
507+ // var pClusterReadings []int
508+ // var pClusterFreqReadings []int
509509 for _ , line := range lines {
510510 residencyMatches := residencyRe .FindStringSubmatch (line )
511511 frequencyMatches := frequencyRe .FindStringSubmatch (line )
@@ -533,6 +533,7 @@ func parseCPUMetrics(powermetricsOutput string, cpuMetrics CPUMetrics) CPUMetric
533533 } else if strings .HasPrefix (cluster , "P" ) {
534534 pClusterActiveTotal += int (percent )
535535 pClusterCount ++
536+ cpuMetrics .PClusterActive = pClusterActiveTotal / pClusterCount
536537 }
537538 }
538539
@@ -559,11 +560,11 @@ func parseCPUMetrics(powermetricsOutput string, cpuMetrics CPUMetrics) CPUMetric
559560 } else if strings .HasPrefix (cluster , "P" ) {
560561 pClusterFreqTotal += int (freqMHz )
561562 cpuMetrics .PClusterFreqMHz = pClusterFreqTotal
562- pClusterFreqReadings = append (pClusterFreqReadings , freqMHz )
563- if len (pClusterFreqReadings ) > numReadings {
564- pClusterFreqReadings = pClusterFreqReadings [1 :] // Remove the oldest reading
565- }
566- cpuMetrics .PClusterFreqMHz = average (pClusterFreqReadings )
563+ // pClusterFreqReadings = append(pClusterFreqReadings, freqMHz)
564+ // if len(pClusterFreqReadings) > numReadings {
565+ // pClusterFreqReadings = pClusterFreqReadings[1:] // Remove the oldest reading
566+ // }
567+ // cpuMetrics.PClusterFreqMHz = average(pClusterFreqReadings)
567568 }
568569 }
569570
@@ -607,13 +608,29 @@ func parseCPUMetrics(powermetricsOutput string, cpuMetrics CPUMetrics) CPUMetric
607608 cpuMetrics .ECores = eCores
608609 cpuMetrics .PCores = pCores
609610
610- // Calculate average P-Cluster Active using a moving average
611- currentPActive := (cpuMetrics .P0ClusterActive + cpuMetrics .P1ClusterActive + cpuMetrics .P2ClusterActive + cpuMetrics .P3ClusterActive ) / 4
612- pClusterReadings = append (pClusterReadings , currentPActive )
613- if len (pClusterReadings ) > numReadings {
614- pClusterReadings = pClusterReadings [1 :] // Remove the oldest reading
611+ if cpuMetrics .E1ClusterActive != 0 {
612+ // M1 Ultra
613+ cpuMetrics .EClusterActive = (cpuMetrics .E0ClusterActive + cpuMetrics .E1ClusterActive ) / 2
614+ cpuMetrics .EClusterFreqMHz = max (cpuMetrics .E0ClusterFreqMHz , cpuMetrics .E1ClusterFreqMHz )
615+ }
616+
617+ if cpuMetrics .P3ClusterActive != 0 {
618+ // M1 Ultra
619+ cpuMetrics .PClusterActive = (cpuMetrics .P0ClusterActive + cpuMetrics .P1ClusterActive + cpuMetrics .P2ClusterActive + cpuMetrics .P3ClusterActive ) / 4
620+ freqs := []int {cpuMetrics .P0ClusterFreqMHz , cpuMetrics .P1ClusterFreqMHz , cpuMetrics .P2ClusterFreqMHz , cpuMetrics .P3ClusterFreqMHz }
621+ cpuMetrics .PClusterFreqMHz = maxInt (freqs )
622+ } else {
623+ cpuMetrics .PClusterActive = (cpuMetrics .P0ClusterActive + cpuMetrics .P1ClusterActive ) / 2
624+ cpuMetrics .PClusterFreqMHz = max (cpuMetrics .P0ClusterFreqMHz , cpuMetrics .P1ClusterFreqMHz )
615625 }
616- cpuMetrics .PClusterActive = average (pClusterReadings )
626+
627+ // // Calculate average P-Cluster Active using a moving average
628+ // currentPActive := (cpuMetrics.P0ClusterActive + cpuMetrics.P1ClusterActive + cpuMetrics.P2ClusterActive + cpuMetrics.P3ClusterActive) / 4
629+ // pClusterReadings = append(pClusterReadings, currentPActive)
630+ // if len(pClusterReadings) > numReadings {
631+ // pClusterReadings = pClusterReadings[1:] // Remove the oldest reading
632+ // }
633+ // cpuMetrics.PClusterActive = average(pClusterReadings)
617634
618635 // Calculate average active residency and frequency for E and P clusters
619636 if eClusterCount > 0 {
@@ -631,6 +648,26 @@ func average(nums []int) int {
631648 return sum / len (nums )
632649}
633650
651+ func max (nums ... int ) int {
652+ maxVal := nums [0 ]
653+ for _ , num := range nums [1 :] {
654+ if num > maxVal {
655+ maxVal = num
656+ }
657+ }
658+ return maxVal
659+ }
660+
661+ func maxInt (nums []int ) int {
662+ max := nums [0 ]
663+ for _ , num := range nums {
664+ if num > max {
665+ max = num
666+ }
667+ }
668+ return max
669+ }
670+
634671func parseGPUMetrics (powermetricsOutput string , gpuMetrics GPUMetrics ) GPUMetrics {
635672 re := regexp .MustCompile (`GPU HW active residency:\s+(\d+\.\d+)%` ) // Regex to capture the floating-point number followed by '%'
636673 lines := strings .Split (powermetricsOutput , "\n " )
0 commit comments