mirror of
https://github.com/RRZE-HPC/OSACA.git
synced 2026-01-08 04:00:05 +01:00
added comment line marker support and adjusted tests
This commit is contained in:
@@ -3,6 +3,8 @@ from collections import OrderedDict
|
||||
|
||||
from osaca.parser import ParserAArch64v81, ParserX86ATT, get_parser
|
||||
|
||||
COMMENT_MARKER = {'start': 'OSACA-BEGIN', 'end': 'OSACA-END'}
|
||||
|
||||
|
||||
def reduce_to_section(kernel, isa):
|
||||
isa = isa.lower()
|
||||
@@ -22,14 +24,27 @@ def reduce_to_section(kernel, isa):
|
||||
def find_marked_kernel_AArch64(lines):
|
||||
nop_bytes = ['213', '3', '32', '31']
|
||||
return find_marked_section(
|
||||
lines, ParserAArch64v81(), ['mov'], 'x1', [111, 222], nop_bytes, reverse=True
|
||||
lines,
|
||||
ParserAArch64v81(),
|
||||
['mov'],
|
||||
'x1',
|
||||
[111, 222],
|
||||
nop_bytes,
|
||||
reverse=True,
|
||||
comments=COMMENT_MARKER,
|
||||
)
|
||||
|
||||
|
||||
def find_marked_kernel_x86ATT(lines):
|
||||
nop_bytes = ['100', '103', '144']
|
||||
return find_marked_section(
|
||||
lines, ParserX86ATT(), ['mov', 'movl'], 'ebx', [111, 222], nop_bytes
|
||||
lines,
|
||||
ParserX86ATT(),
|
||||
['mov', 'movl'],
|
||||
'ebx',
|
||||
[111, 222],
|
||||
nop_bytes,
|
||||
comments=COMMENT_MARKER,
|
||||
)
|
||||
|
||||
|
||||
@@ -70,13 +85,20 @@ def get_marker(isa, comment=""):
|
||||
return start_marker, end_marker
|
||||
|
||||
|
||||
def find_marked_section(lines, parser, mov_instr, mov_reg, mov_vals, nop_bytes, reverse=False):
|
||||
def find_marked_section(
|
||||
lines, parser, mov_instr, mov_reg, mov_vals, nop_bytes, reverse=False, comments=None
|
||||
):
|
||||
# TODO match to instructions returned by get_marker
|
||||
index_start = -1
|
||||
index_end = -1
|
||||
for i, line in enumerate(lines):
|
||||
try:
|
||||
if line.instruction in mov_instr and lines[i + 1].directive is not None:
|
||||
if line.instruction is None and comments is not None and line.comment is not None:
|
||||
if comments['start'] == line.comment:
|
||||
index_start = i + 1
|
||||
elif comments['end'] == line.comment:
|
||||
index_end = i
|
||||
elif line.instruction in mov_instr and lines[i + 1].directive is not None:
|
||||
source = line.operands[0 if not reverse else 1]
|
||||
destination = line.operands[1 if not reverse else 0]
|
||||
# instruction pair matches, check for operands
|
||||
@@ -121,7 +143,7 @@ def match_bytes(lines, index, byte_list):
|
||||
line_count += 1
|
||||
extracted_bytes += lines[index].directive.parameters
|
||||
index += 1
|
||||
if extracted_bytes[0:len(byte_list)] == byte_list:
|
||||
if extracted_bytes[0 : len(byte_list)] == byte_list:
|
||||
return True, line_count
|
||||
return False, -1
|
||||
|
||||
@@ -156,7 +178,7 @@ def find_jump_labels(lines):
|
||||
if all(
|
||||
[
|
||||
l['instruction'].startswith('.')
|
||||
for l in lines[labels[label][0]:labels[label][1]]
|
||||
for l in lines[labels[label][0] : labels[label][1]]
|
||||
if l['instruction'] is not None
|
||||
]
|
||||
):
|
||||
@@ -180,7 +202,7 @@ def find_basic_blocks(lines):
|
||||
blocks = OrderedDict()
|
||||
for label, label_line_idx in valid_jump_labels.items():
|
||||
blocks[label] = []
|
||||
for line in lines[label_line_idx + 1:]:
|
||||
for line in lines[label_line_idx + 1 :]:
|
||||
terminate = False
|
||||
blocks[label].append(line)
|
||||
# Find end of block by searching for references to valid jump labels
|
||||
@@ -209,7 +231,7 @@ def find_basic_loop_bodies(lines):
|
||||
loop_bodies = OrderedDict()
|
||||
for label, label_line_idx in valid_jump_labels.items():
|
||||
current_block = []
|
||||
for line in lines[label_line_idx + 1:]:
|
||||
for line in lines[label_line_idx + 1 :]:
|
||||
terminate = False
|
||||
current_block.append(line)
|
||||
# Find end of block by searching for references to valid jump labels
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
// mov x1, #111
|
||||
// .byte 213,3,32,31
|
||||
// OSACA-BEGIN
|
||||
.LBB0_32:
|
||||
ldp q4, q5, [x9, #-32]
|
||||
ldp q6, q7, [x9], #64
|
||||
@@ -23,5 +22,4 @@
|
||||
fmov s1, #2.0e+2f
|
||||
prfm pldl1keep, [x26, #2112]
|
||||
b.ne .LBB0_32
|
||||
// mov x1, #222
|
||||
// .byte 213,3,32,31
|
||||
// OSACA-END
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#movl $111,%ebx
|
||||
#.byte 100,103,144
|
||||
# OSACA-BEGIN
|
||||
.L10:
|
||||
vmovapd (%r15,%rax), %ymm0
|
||||
vmovapd (%r12,%rax), %ymm3
|
||||
@@ -9,5 +8,4 @@
|
||||
addq $32, %rax
|
||||
cmpl %ecx, %r10d
|
||||
ja .L10
|
||||
#movl $222,%ebx
|
||||
#.byte 100,103,144
|
||||
# OSACA-END
|
||||
|
||||
@@ -108,48 +108,48 @@ class TestSemanticTools(unittest.TestCase):
|
||||
|
||||
def test_kernelDG_x86(self):
|
||||
#
|
||||
# 3
|
||||
# \___>5__>6
|
||||
# 4
|
||||
# \___>6__>7
|
||||
# /
|
||||
# 2
|
||||
# 4_______>8
|
||||
# 3
|
||||
# 5_______>9
|
||||
#
|
||||
dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx)
|
||||
self.assertTrue(nx.algorithms.dag.is_directed_acyclic_graph(dg.dg))
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=3))), 1)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=3)), 6)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=4))), 1)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 7)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=4)), 6)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=5))), 1)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 7)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=5)), 9)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=6))), 1)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=6)), 10)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=7))), 1)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=7)), 8)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=6)), 7)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=7))), 0)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=8))), 0)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=9))), 0)
|
||||
with self.assertRaises(ValueError):
|
||||
dg.get_dependent_instruction_forms()
|
||||
|
||||
def test_kernelDG_AArch64(self):
|
||||
dg = KernelDG(self.kernel_AArch64, self.parser_AArch64, self.machine_model_tx2)
|
||||
self.assertTrue(nx.algorithms.dag.is_directed_acyclic_graph(dg.dg))
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=4)), {8, 9})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=5)), {10, 11})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=6)), {7, 8, 9})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=7)), {10, 11})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=3)), {7, 8})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=4)), {9, 10})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=5)), {6, 7, 8})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=6)), {9, 10})
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=7)), 13)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=8)), 14)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=9)), 15)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=9)), 16)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=10)), 17)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=11)), 18)
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=12)), {14, 15})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=13)), {17, 18})
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=14)), 16)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=15)), 16)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=16))), 0)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=17)), 19)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=18)), 19)
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=11)), {13, 14})
|
||||
self.assertEqual(set(dg.get_dependent_instruction_forms(line_number=12)), {16, 17})
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=13)), 15)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=14)), 15)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=15))), 0)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=16)), 18)
|
||||
self.assertEqual(next(dg.get_dependent_instruction_forms(line_number=17)), 18)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=18))), 0)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=19))), 0)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=20))), 0)
|
||||
self.assertEqual(len(list(dg.get_dependent_instruction_forms(line_number=21))), 0)
|
||||
with self.assertRaises(ValueError):
|
||||
dg.get_dependent_instruction_forms()
|
||||
|
||||
@@ -185,12 +185,12 @@ class TestSemanticTools(unittest.TestCase):
|
||||
dg.get_loopcarried_dependencies()
|
||||
|
||||
def test_loop_carried_dependency_x86(self):
|
||||
lcd_id = 9
|
||||
lcd_id2 = 10
|
||||
lcd_id = 8
|
||||
lcd_id2 = 9
|
||||
dg = KernelDG(self.kernel_x86, self.parser_x86, self.machine_model_csx)
|
||||
lc_deps = dg.get_loopcarried_dependencies()
|
||||
self.assertEqual(len(lc_deps), 2)
|
||||
# ID 9
|
||||
# ID 8
|
||||
self.assertEqual(
|
||||
lc_deps[lcd_id]['root'], dg.dg.nodes(data=True)[lcd_id]['instruction_form']
|
||||
)
|
||||
@@ -198,7 +198,7 @@ class TestSemanticTools(unittest.TestCase):
|
||||
self.assertEqual(
|
||||
lc_deps[lcd_id]['dependencies'][0], dg.dg.nodes(data=True)[lcd_id]['instruction_form']
|
||||
)
|
||||
# ursprünglich ID 6 mit LCD zu ID 6 (len=1)
|
||||
# ID 9 ursprünglich ID 5 mit LCD zu ID 5 (len=1)
|
||||
# TODO discuss
|
||||
self.assertEqual(
|
||||
lc_deps[lcd_id2]['root'], dg.dg.nodes(data=True)[lcd_id2]['instruction_form']
|
||||
|
||||
Reference in New Issue
Block a user