project init
This commit is contained in:
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
# Python-generated files
|
||||
__pycache__/
|
||||
*.py[oc]
|
||||
build/
|
||||
dist/
|
||||
wheels/
|
||||
*.egg-info
|
||||
|
||||
# Virtual environments
|
||||
.venv
|
||||
7
pyproject.toml
Normal file
7
pyproject.toml
Normal file
@@ -0,0 +1,7 @@
|
||||
[project]
|
||||
name = "speccpulib"
|
||||
version = "0.1.0"
|
||||
description = "Scripts that helps debugging SPEC CPU benchmark suite."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.9"
|
||||
dependencies = []
|
||||
22
src/speccpu/__init__.py
Normal file
22
src/speccpu/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import copy
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
def get_spec_env(spec_dir: Path):
|
||||
new_env = copy.deepcopy(os.environ)
|
||||
new_env["SPEC"] = str(spec_dir)
|
||||
new_env["PATH"] = os.pathsep.join(
|
||||
[
|
||||
str(spec_dir / "bin"),
|
||||
*new_env["PATH"].split(os.pathsep),
|
||||
]
|
||||
)
|
||||
return new_env
|
||||
|
||||
def find_build(build_dir: Path) -> Path:
|
||||
entries = list(sorted(os.listdir(build_dir)))
|
||||
for entry in entries:
|
||||
if entry.startswith("build"):
|
||||
return build_dir / entry
|
||||
raise RuntimeError(f"SPEC build directory not found at {build_dir}")
|
||||
84
src/speccpu/x264.py
Normal file
84
src/speccpu/x264.py
Normal file
@@ -0,0 +1,84 @@
|
||||
import os
|
||||
import shutil
|
||||
from pathlib import Path
|
||||
from subprocess import run
|
||||
|
||||
|
||||
def get_mc_path(build):
|
||||
return build / "src" / "common" / "mc.c"
|
||||
|
||||
|
||||
def get_ref_add_pragma(mc_lines):
|
||||
# Initialize variables
|
||||
modified_lines = []
|
||||
pragma_added = False
|
||||
|
||||
pragma_str = "#pragma clang loop vectorize(disable)"
|
||||
|
||||
# Iterate through each line to find the target for loop
|
||||
for i, line in enumerate(mc_lines):
|
||||
# If there are already #pragma string, skip it.
|
||||
if i > 1 and pragma_str in mc_lines[i - 1]:
|
||||
continue
|
||||
if "for( int x = 0; x < i_width; x++ )" in line:
|
||||
modified_lines.append("#pragma clang loop vectorize(disable)\n")
|
||||
pragma_added = True
|
||||
|
||||
modified_lines.append(line)
|
||||
|
||||
return modified_lines, pragma_added
|
||||
|
||||
|
||||
def disable_mc_loop_vectorize(mc_path: Path) -> bool:
|
||||
"""
|
||||
Disable x264 mc.c loop vectorizing, mainly for "get_ref" performance.
|
||||
If needed, update the file located at mc_path, returns true if that file is updated.
|
||||
"""
|
||||
# Read the content of mc.c
|
||||
with open(mc_path, "r") as mc_file:
|
||||
mc_lines = mc_file.readlines()
|
||||
|
||||
mc_pragma_lines, mc_modified = get_ref_add_pragma(mc_lines)
|
||||
|
||||
if mc_modified:
|
||||
with open(mc_path, "w") as mc:
|
||||
mc.writelines(mc_pragma_lines)
|
||||
|
||||
return mc_modified
|
||||
|
||||
|
||||
def update_exe(build_exe, exe_dir):
|
||||
exe_file = exe_dir / "x264_s_base.mytest-m64"
|
||||
|
||||
shutil.copy2(build_exe, exe_file)
|
||||
print(f"Copied to {exe_file}")
|
||||
|
||||
|
||||
def make(build, spec_env):
|
||||
build_exe = build / "x264_s"
|
||||
|
||||
run(
|
||||
[
|
||||
"make",
|
||||
"TARGET=s",
|
||||
],
|
||||
check=True,
|
||||
env=spec_env,
|
||||
cwd=build,
|
||||
)
|
||||
|
||||
# Copy "s" into run_dir
|
||||
if not build_exe.exists():
|
||||
raise RuntimeError(f"x264 exe not generated! Please verify make process")
|
||||
return build_exe
|
||||
|
||||
|
||||
def recompile_mc(mc_path: Path, build: Path, spec_env: os._Environ):
|
||||
# Recompile mc.o
|
||||
mc_o_path = mc_path.with_suffix(".o")
|
||||
if mc_o_path.exists():
|
||||
print(f"Found exist mc.o file at {mc_o_path}")
|
||||
mc_o_path.unlink()
|
||||
|
||||
# Run "make"
|
||||
return make(build, spec_env)
|
||||
Reference in New Issue
Block a user