ci : fix parsing of vgpr counts in hip-quality-check (#20987)

* scripts: hip: gcn-cdna-vgpr-check: fix parsing of vgpr counts when an amdclang Remark block is interlieved with another from a different process

* Return warning ignore

* obay pep8 inline double space before inline commets

* add # noqa: NP100 for other prints too

* Add script changes to cause autotrigger
This commit is contained in:
uvos
2026-03-25 19:00:37 +01:00
committed by GitHub
parent 80322ebdaf
commit ec54ac13a8
2 changed files with 46 additions and 27 deletions
+4 -2
View File
@@ -8,7 +8,8 @@ on:
paths: [ paths: [
'.github/workflows/hip-quality-check.yml', '.github/workflows/hip-quality-check.yml',
'**/*.cu', '**/*.cu',
'**/*.cuh' '**/*.cuh',
'scripts/hip/gcn-cdna-vgpr-check.py'
] ]
pull_request: pull_request:
@@ -16,7 +17,8 @@ on:
paths: [ paths: [
'.github/workflows/hip-quality-check.yml', '.github/workflows/hip-quality-check.yml',
'**/*.cu', '**/*.cu',
'**/*.cuh' '**/*.cuh',
'scripts/hip/gcn-cdna-vgpr-check.py'
] ]
concurrency: concurrency:
+36 -19
View File
@@ -2,35 +2,49 @@
import sys import sys
from collections import defaultdict from collections import defaultdict
import re
def parse_log_file(filepath): def parse_log_file(filepath):
"""Parse log file and extract function VGPR usage."""
import re
functions = defaultdict(lambda: {'vgprs': 0, 'spill': 0, 'location': ''}) functions = defaultdict(lambda: {'vgprs': 0, 'spill': 0, 'location': ''})
func_stack = []
try: try:
with open(filepath, 'r') as f: with open(filepath, 'r') as f:
content = f.read() for line in f:
# Find all function entries with VGPR usage including location # Match function name lines
pattern = r'([^:]+:\d+):.*?Function Name: (\S+).*?VGPRs: (\d+).*?VGPRs Spill: (\d+)' func_match = re.search(r'remark: ([^:]+):(\d+):\d+: Function Name: (\S+)', line)
matches = re.findall(pattern, content, re.DOTALL) if func_match:
location = func_match.group(1) + ':' + func_match.group(2)
for location, func_name, vgprs, spill in matches: func_name = func_match.group(3)
functions[func_name]['vgprs'] = int(vgprs)
functions[func_name]['spill'] = int(spill)
# Extract just the filename and line number # Extract just the filename and line number
parts = location.split('/') parts = location.split('/')
if len(parts) > 0: short_location = parts[-1] if len(parts) > 0 else location
short_location = parts[-1] # Get last part (filename)
# Check if there's a line number after filename
if ':' in short_location:
functions[func_name]['location'] = short_location functions[func_name]['location'] = short_location
else: # Push function onto stack with its location
functions[func_name]['location'] = location func_stack.append({'name': func_name, 'location': location})
else: continue
functions[func_name]['location'] = location
# Match VGPR usage lines (only if we have functions in stack)
vgpr_match = re.search(r'remark: ([^:]+):(\d+):\d+:\s+VGPRs: (\d+)', line)
if vgpr_match:
location = vgpr_match.group(1) + ':' + vgpr_match.group(2)
# Find the most recent function with matching location
for i in range(len(func_stack) - 1, -1, -1):
if func_stack[i]['location'] == location:
functions[func_stack[i]['name']]['vgprs'] = int(vgpr_match.group(3))
break
continue
spill_match = re.search(r'remark: ([^:]+):(\d+):\d+:\s+VGPRs Spill: (\d+)', line)
if spill_match:
location = spill_match.group(1) + ':' + spill_match.group(2)
# Find the most recent function with matching location
for i in range(len(func_stack) - 1, -1, -1):
if func_stack[i]['location'] == location:
functions[func_stack[i]['name']]['spill'] = int(spill_match.group(3))
break
continue
except FileNotFoundError: except FileNotFoundError:
print(f"Error: File {filepath} not found", file=sys.stderr) # noqa: NP100 print(f"Error: File {filepath} not found", file=sys.stderr) # noqa: NP100
sys.exit(1) sys.exit(1)
@@ -123,6 +137,9 @@ def main():
'_ZL18flash_attn_ext_f16ILi128ELi128ELi32ELi2ELb1ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil', '_ZL18flash_attn_ext_f16ILi128ELi128ELi32ELi2ELb1ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil',
'_ZL18flash_attn_ext_f16ILi128ELi128ELi4ELi8ELb1ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil', '_ZL18flash_attn_ext_f16ILi128ELi128ELi4ELi8ELb1ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil',
'_ZL18flash_attn_ext_f16ILi96ELi96ELi4ELi8ELb0ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil', '_ZL18flash_attn_ext_f16ILi96ELi96ELi4ELi8ELb0ELb0EEvPKcS1_S1_S1_S1_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS5_IjLj3EEiiiiiiiiiiiliiliiiiil',
'_ZL18flash_attn_ext_vecILi128ELi2EL9ggml_type2ELS0_2ELb0EEvPKcS2_S2_S2_S2_PKiPfP15HIP_vector_typeIfLj2EEffffjfiS6_IjLj3EEiiiiiiiiiiiliiliiiiil',
'_ZL9mul_mat_qIL9ggml_type10ELi16ELb1EEvPKcPKiS4_S4_PfS5_iiiiiiiiiiiiiiiii',
'_ZL9mul_mat_qIL9ggml_type12ELi128ELb1EEvPKcPKiS4_S4_PfS5_iiiiiiiiiiiiiiiii'
} }
functions = parse_log_file(log_file) functions = parse_log_file(log_file)