🍁

Swift: M1 MacのGPU使用率を取得する

2022/02/25に公開

内蔵GPUについて。外付けGPUだともう一工夫必要。
とりあえずソースだけ貼る。

import Foundation
import IOKit

func fetchIOService(_ name: String) -> [[String : AnyObject]] {
    var result: [[String : AnyObject]] = []
    let serviceMatching = IOServiceMatching(name)
    var iterator = io_iterator_t()
    if IOServiceGetMatchingServices(kIOMasterPortDefault, serviceMatching, &iterator) == kIOReturnSuccess {
        while case let regEntry = IOIteratorNext(iterator), regEntry != 0 {
            var services: Unmanaged<CFMutableDictionary>? = nil
            if IORegistryEntryCreateCFProperties(regEntry, &services, kCFAllocatorDefault, 0) == kIOReturnSuccess {
                guard let servicesDict = services?.takeUnretainedValue() as? [String : AnyObject] else { continue }
                services?.release()
                result.append(servicesDict)
            }
            IOObjectRelease(regEntry)
        }
        IOObjectRelease(iterator)
    }
    return result
}

let accelerators = fetchIOService(kIOAcceleratorClassName)
accelerators.forEach { dict in
    if let c = dict["IOClass"] as? String {
        if c.lowercased().contains("agx") {
            Swift.print("Apple Graphics: \(c)")
        } else {
            Swift.print("Graphics: \(c)")
        }
    }
    if let ps = dict["PerformanceStatistics"] as? [String : AnyObject] {
        if let v = ps["Device Utilization %"] as? Int {
            Swift.print("GPU: \(v)%")
        }
        if let v = ps["Renderer Utilization %"] as? Int {
            Swift.print("Renderer: \(v)%")
        }
        if let v = ps["Tiler Utilization %"] as? Int {
            Swift.print("Tiler: \(v)%")
        }
    }
}

Discussion