2025-02-08 22:23:40 -06:00

96 lines
4.1 KiB
Python

import subprocess
import os
import time
import re
import csv
temp_cmd = ["sensors", "coretemp-isa-0000"]
power_cmd = ["turbostat", "--quiet", "--hide", "CorWatt,Die,Core,CPU,Busy%,Bzy_MHz,TSC_MHz,IPC,IRQ,SMI,POLL,C1,C2,C3,POLL%,C1%,C2%,C3%,C1ACPI,C2ACPI,C3ACPI,C1ACPI%,C2ACPI%,C3ACPI%,CPU%c1,CPU%c6,CPU%c7,CoreTmp,CoreThr,PkgTmp,Totl%C0,Any%C0,GFX%C0,CPUGFX%,Pkg%pc2,Pkg%pc3,Pkg%pc6,Pkg%pc8,Pk%pc10,CPU%LPI,SYS%LPI,GFXWatt,RAMWatt,PKG_%,RAM_%,UncMHz",
"-i", "0.001", "--num_iterations", "1", "--Summary"]
csv_fieldnames = ["AVX512", "Resolution", "Encoder", "Preset", "Run Time", "Temperature", "MHz", "Watts"]
cur_dir = os.getcwd()
def ffmpeg_cmd(resolution: str, encoder: str, preset: str, avx: str = "") -> None:
cmd = f"ssh -t knowledge@nazrin \"ffmpeg -i '{cur_dir}/{resolution}_input.mkv' -c:v {encoder} -preset {preset} {avx} /tmp/output.mkv -y\""
print(cmd)
num_tests = 5
run_time_accumulation = 0
temp_accumulation = 0
mhz_accumulation = 0
watt_accumulation = 0
stat_track_iterations = 0
for x in range(num_tests):
start_time = time.time()
with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True) as process:
while not process.stdout.readline().startswith("frame="):
continue
while process.poll() is None:
stdout_line = process.stdout.readline().split()
temperature = subprocess.run(temp_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
temp_reading = re.search(r"[0-9][0-9][.][0-9]",temperature.stdout)
temp_accumulation += float(temp_reading[0])
power = subprocess.run(power_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
power_reading = power.stdout.split()
mhz_accumulation += int(power_reading[2])
watt_accumulation += float(power_reading[3])
stat_track_iterations += 1
if len(stdout_line) > 6:
print(f"Temp: {temp_reading[0]} MHz: {power_reading[2]} Pwr: {power_reading[3]} FPS: {stdout_line[2]} Time: {stdout_line[6]}", end='\r')
run_time_accumulation += time.time() - start_time
os.remove("/tmp/output.mkv")
run_time_avg = run_time_accumulation / num_tests
temp_avg = temp_accumulation / stat_track_iterations
mhz_avg = mhz_accumulation / stat_track_iterations
watt_avg = watt_accumulation / stat_track_iterations
print(f"run time: {run_time_avg}")
print(f"temperature: {temp_avg}")
print(f"mhz: {mhz_avg}")
print(f"power: {watt_avg}")
avx512 = "Off"
if (encoder == "libx265" and avx != "") or (encoder == "libsvtav1" and avx == ""):
avx512 = "On"
results_dict = {
"AVX512": avx512,
"Resolution": resolution,
"Encoder": encoder,
"Preset": preset,
"Run Time": round(run_time_avg, 2),
"Temperature": round(temp_avg, 2),
"MHz": round(mhz_avg, 2),
"Watts": round(watt_avg, 2)
}
with open('results.csv', 'a', newline='') as results_file:
writer = csv.DictWriter(results_file, csv_fieldnames)
writer.writerow(results_dict)
def main() -> None:
with open('results.csv', 'w', newline='') as results_file:
writer = csv.DictWriter(results_file, csv_fieldnames)
writer.writeheader()
x265_presets = ["ultrafast", "superfast", "veryfast", "faster", "fast",
"medium", "slow", "slower", "veryslow", "placebo"]
av1_presets = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"]
resolutions = ["720p", "1080p", "4k"]
for preset in av1_presets:
for resolution in resolutions:
ffmpeg_cmd(resolution, "libsvtav1", preset, "-svtav1-params \"asm=9\"")
#ffmpeg_cmd(resolution, "libsvtav1", preset)
for preset in x265_presets:
for resolution in resolutions:
ffmpeg_cmd(resolution, "libx265", preset)
#ffmpeg_cmd(resolution, "libx265", preset, "-x265-params \"asm=avx512\"")
if __name__ == "__main__":
main()