96 lines
4.1 KiB
Python
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()
|