diff --git a/tests/main/test_constrainted_mapping/__init__.py b/tests/main/test_constrainted_mapping/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/main/test_constrainted_mapping/test_ascend_like.py b/tests/main/test_constrainted_mapping/test_ascend_like.py new file mode 100644 index 000000000..14234b733 --- /dev/null +++ b/tests/main/test_constrainted_mapping/test_ascend_like.py @@ -0,0 +1,40 @@ +import pytest + +from zigzag.api import get_hardware_performance_zigzag +from zigzag.visualization.results.print_mapping import get_temporal_spatial_loops + +# Test case for when spatial_mapping is provided, while spatial_mapping_hint is not provided. + +workloads = ( + "zigzag/inputs/workload/resnet18.onnx", + "zigzag/inputs/workload/resnet18.yaml", +) + +# Expected energy and latency for each workload defined above +ens_lats = { + "zigzag/inputs/workload/alexnet.onnx": (5664863934, 8479644), + "zigzag/inputs/workload/mobilenetv2.onnx": (920740293, 3814440), + "zigzag/inputs/workload/resnet18.onnx": (1680938520, 3697986), + "zigzag/inputs/workload/resnet18.yaml": (2286320480, 4418088), +} + + +@pytest.fixture +def mapping(): + return "zigzag/inputs/mapping/ascend_like_constrainted.yaml" + + +@pytest.fixture +def accelerator(): + return "zigzag/inputs/hardware/ascend_like.yaml" + + +@pytest.mark.parametrize("workload", workloads) +def test_api(workload: str, accelerator: str, mapping: str): # pylint: disable=W0621 + energy, latency, cmes = get_hardware_performance_zigzag(workload, accelerator, mapping) + temp_map_default = [get_temporal_spatial_loops(cme[0])[0] for cme in cmes[0][1]] + + for temp_mapping in temp_map_default: + if ("OX" in [dim[0].name for dim in temp_mapping]) and ("OY" in [dim[0].name for dim in temp_mapping]): + assert temp_mapping[-1][0].name == "OX" + assert temp_mapping[-2][0].name == "OY" diff --git a/tests/main/test_constrainted_mapping/test_edge_tpu_like.py b/tests/main/test_constrainted_mapping/test_edge_tpu_like.py new file mode 100644 index 000000000..875d89a79 --- /dev/null +++ b/tests/main/test_constrainted_mapping/test_edge_tpu_like.py @@ -0,0 +1,40 @@ +import pytest + +from zigzag.api import get_hardware_performance_zigzag +from zigzag.visualization.results.print_mapping import get_temporal_spatial_loops + +# Test case for when both spatial_mapping and spatial_mapping_hint are provided. + +workloads = ( + "zigzag/inputs/workload/resnet18.onnx", + "zigzag/inputs/workload/resnet18.yaml", +) + +# Expected energy and latency for each workload defined above +ens_lats = { + "zigzag/inputs/workload/alexnet.onnx": (6159980160, 8337351), + "zigzag/inputs/workload/mobilenetv2.onnx": (742114179, 2421959), + "zigzag/inputs/workload/resnet18.onnx": (1735517944, 4055269), + "zigzag/inputs/workload/resnet18.yaml": (2029477205, 4738407), +} + + +@pytest.fixture +def mapping(): + return "zigzag/inputs/mapping/edge_tpu_like_constrainted.yaml" + + +@pytest.fixture +def accelerator(): + return "zigzag/inputs/hardware/edge_tpu_like.yaml" + + +@pytest.mark.parametrize("workload", workloads) +def test_api(workload: str, accelerator: str, mapping: str): # pylint: disable=W0621 + energy, latency, cmes = get_hardware_performance_zigzag(workload, accelerator, mapping) + temp_map_default = [get_temporal_spatial_loops(cme[0])[0] for cme in cmes[0][1]] + + for temp_mapping in temp_map_default: + if ("OX" in [dim[0].name for dim in temp_mapping]) and ("OY" in [dim[0].name for dim in temp_mapping]): + assert temp_mapping[-2][0].name == "OX" + assert temp_mapping[-1][0].name == "OY" diff --git a/tests/main/test_constrainted_mapping/test_meta_prototype_like.py b/tests/main/test_constrainted_mapping/test_meta_prototype_like.py new file mode 100644 index 000000000..5a2f42d20 --- /dev/null +++ b/tests/main/test_constrainted_mapping/test_meta_prototype_like.py @@ -0,0 +1,40 @@ +import pytest + +from zigzag.api import get_hardware_performance_zigzag +from zigzag.visualization.results.print_mapping import get_temporal_spatial_loops + +# Test case for when an incomplete spatial_mapping is provided and spatial_mapping_hint is also provided. + +workloads = ( + "zigzag/inputs/workload/resnet18.onnx", + "zigzag/inputs/workload/resnet18.yaml", +) + +# Expected energy and latency for each workload defined above +ens_lats = { + "zigzag/inputs/workload/alexnet.onnx": (5681909132.480001, 8279495.0), + "zigzag/inputs/workload/mobilenetv2.onnx": (909647916.68, 2602479.0), + "zigzag/inputs/workload/resnet18.onnx": (1751779924.0000002, 3234867.0), + "zigzag/inputs/workload/resnet18.yaml": (2259198622.68, 3884859.0), +} + + +@pytest.fixture +def mapping(): + return "zigzag/inputs/mapping/meta_prototype_like_constrainted.yaml" + + +@pytest.fixture +def accelerator(): + return "zigzag/inputs/hardware/meta_prototype.yaml" + + +@pytest.mark.parametrize("workload", workloads) +def test_api(workload: str, accelerator: str, mapping: str): # pylint: disable=W0621 + energy, latency, cmes = get_hardware_performance_zigzag(workload, accelerator, mapping) + temp_map_default = [get_temporal_spatial_loops(cme[0])[0] for cme in cmes[0][1]] + + for temp_mapping in temp_map_default: + if ("OX" in [dim[0].name for dim in temp_mapping]) and ("OY" in [dim[0].name for dim in temp_mapping]): + assert temp_mapping[-2][0].name == "OX" + assert temp_mapping[-1][0].name == "OY" diff --git a/tests/main/test_constrainted_mapping/test_tesla_npu_like.py b/tests/main/test_constrainted_mapping/test_tesla_npu_like.py new file mode 100644 index 000000000..b03346a43 --- /dev/null +++ b/tests/main/test_constrainted_mapping/test_tesla_npu_like.py @@ -0,0 +1,39 @@ +import pytest + +from zigzag.api import get_hardware_performance_zigzag +from zigzag.visualization.results.print_mapping import get_temporal_spatial_loops + +# Test case for when only spatial_mapping_hint is provided. + +workloads = ( + "zigzag/inputs/workload/resnet18.onnx", + "zigzag/inputs/workload/resnet18.yaml", +) + +# Expected energy and latency for each workload defined above +ens_lats = { + "zigzag/inputs/workload/alexnet.onnx": (6006136982.778, 8290892.0), + "zigzag/inputs/workload/mobilenetv2.onnx": (947736166.5380002, 1857838.0), + "zigzag/inputs/workload/resnet18.onnx": (1604556365.552, 2828301.0), + "zigzag/inputs/workload/resnet18.yaml": (2094141825.5040002, 3480232.0), +} + + +@pytest.fixture +def mapping(): + return "zigzag/inputs/mapping/tesla_npu_like_constrainted.yaml" + + +@pytest.fixture +def accelerator(): + return "zigzag/inputs/hardware/tesla_npu_like.yaml" + + +@pytest.mark.parametrize("workload", workloads) +def test_api(workload: str, accelerator: str, mapping: str): # pylint: disable=W0621 + energy, latency, cmes = get_hardware_performance_zigzag(workload, accelerator, mapping) + temp_map_default = [get_temporal_spatial_loops(cme[0])[0] for cme in cmes[0][1]] + + for temp_mapping in temp_map_default: + if "OY" in [dim[0].name for dim in temp_mapping]: + assert temp_mapping[-1][0].name == "OY" diff --git a/tests/main/test_constrainted_mapping/test_tpu_like.py b/tests/main/test_constrainted_mapping/test_tpu_like.py new file mode 100644 index 000000000..4c15c552c --- /dev/null +++ b/tests/main/test_constrainted_mapping/test_tpu_like.py @@ -0,0 +1,40 @@ +import pytest + +from zigzag.api import get_hardware_performance_zigzag +from zigzag.visualization.results.print_mapping import get_temporal_spatial_loops + +# Test case for when more non-existent dimensions are provided in spatial_mapping_hint. + +workloads = ( + "zigzag/inputs/workload/resnet18.onnx", + "zigzag/inputs/workload/resnet18.yaml", +) + +# Expected energy and latency for each workload defined above +ens_lats = { + "zigzag/inputs/workload/alexnet.onnx": (5589583403, 8671208), + "zigzag/inputs/workload/mobilenetv2.onnx": (932571650, 7304307), + "zigzag/inputs/workload/resnet18.onnx": (1759424218.3160002, 4495469.0), + "zigzag/inputs/workload/resnet18.yaml": (2191903732.78, 4845353.0), +} + + +@pytest.fixture +def mapping(): + return "zigzag/inputs/mapping/tpu_like_constrainted.yaml" + + +@pytest.fixture +def accelerator(): + return "zigzag/inputs/hardware/tpu_like.yaml" + + +@pytest.mark.parametrize("workload", workloads) +def test_api(workload: str, accelerator: str, mapping: str): # pylint: disable=W0621 # pylint: disable=W0621 + energy, latency, cmes = get_hardware_performance_zigzag(workload, accelerator, mapping) + temp_map_default = [get_temporal_spatial_loops(cme[0])[0] for cme in cmes[0][1]] + + for temp_mapping in temp_map_default: + if ("OX" in [dim[0].name for dim in temp_mapping]) and ("OY" in [dim[0].name for dim in temp_mapping]): + assert temp_mapping[-2][0].name == "OX" + assert temp_mapping[-1][0].name == "OY" diff --git a/zigzag/inputs/mapping/ascend_like_constrainted.yaml b/zigzag/inputs/mapping/ascend_like_constrainted.yaml new file mode 100644 index 000000000..aedfb35e4 --- /dev/null +++ b/zigzag/inputs/mapping/ascend_like_constrainted.yaml @@ -0,0 +1,39 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 16 + D2: + - C, 16 + D3: + - OX, 2 + D4: + - OY, 2 + temporal_ordering: + - [OX, '*'] + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Add + core_allocation: [1] + spatial_mapping: + D1: + - G, 16 + D2: + - C, 1 + D3: + - OX, 1 + D4: + - OY, 1 + temporal_ordering: + - [OX, '*'] + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 diff --git a/zigzag/inputs/mapping/default_constrainted.yaml b/zigzag/inputs/mapping/default_constrainted.yaml new file mode 100644 index 000000000..5d3fe5dc6 --- /dev/null +++ b/zigzag/inputs/mapping/default_constrainted.yaml @@ -0,0 +1,15 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 32 + D2: + - C, 32 + temporal_ordering: + - [OX, '*'] + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 diff --git a/zigzag/inputs/mapping/edge_tpu_like_constrainted.yaml b/zigzag/inputs/mapping/edge_tpu_like_constrainted.yaml new file mode 100644 index 000000000..3505535ab --- /dev/null +++ b/zigzag/inputs/mapping/edge_tpu_like_constrainted.yaml @@ -0,0 +1,59 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 8 + D2: + - C, 8 + D3: + - OX, 4 + D4: + - OY, 4 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Add + core_allocation: [1] + spatial_mapping: + D1: + - G, 8 + D2: + - C, 1 + D3: + - OX, 1 + D4: + - OY, 1 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Pooling + core_allocation: [1] + spatial_mapping: + D1: + - G, 8 + D2: + - C, 1 + D3: + - OX, 1 + D4: + - OY, 1 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 diff --git a/zigzag/inputs/mapping/meta_prototype_like_constrainted.yaml b/zigzag/inputs/mapping/meta_prototype_like_constrainted.yaml new file mode 100644 index 000000000..f7c0579b9 --- /dev/null +++ b/zigzag/inputs/mapping/meta_prototype_like_constrainted.yaml @@ -0,0 +1,39 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 32 + D2: + - C, 2 + D3: + - OX, 4 + D4: + - OY, 4 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Add + core_allocation: [1] + spatial_mapping: + D1: + - G, 32 + D2: + - C, 1 + D3: + - OX, 1 + D4: + - OY, 1 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 diff --git a/zigzag/inputs/mapping/tesla_npu_like_constrainted.yaml b/zigzag/inputs/mapping/tesla_npu_like_constrainted.yaml new file mode 100644 index 000000000..708d31c96 --- /dev/null +++ b/zigzag/inputs/mapping/tesla_npu_like_constrainted.yaml @@ -0,0 +1,50 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 32 + D2: + - OX, 8 + D3: + - OY, 4 + temporal_ordering: + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Add + core_allocation: [1] + spatial_mapping: + D1: + - G, 32 + D2: + - OX, 1 + D3: + - OY, 1 + temporal_ordering: + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Pooling + core_allocation: [1] + spatial_mapping: + D1: + - G, 32 + D2: + - OX, 1 + D3: + - OY, 1 + temporal_ordering: + - [OY, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 \ No newline at end of file diff --git a/zigzag/inputs/mapping/tpu_like_constrainted.yaml b/zigzag/inputs/mapping/tpu_like_constrainted.yaml new file mode 100644 index 000000000..d731eeb2e --- /dev/null +++ b/zigzag/inputs/mapping/tpu_like_constrainted.yaml @@ -0,0 +1,65 @@ +- name: default + core_allocation: [1] + spatial_mapping: + D1: + - K, 32 + D2: + - C, 32 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Add + core_allocation: [1] + spatial_mapping: + D1: + - G, 32 + D2: + - C, 1 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: Pooling + core_allocation: [1] + spatial_mapping: + D1: + - G, 32 + D2: + - C, 1 + temporal_ordering: + - [OY, '*'] + - [OX, '*'] + - ['*','*'] + memory_operand_links: + O: O + W: I2 + I: I1 + +- name: example_name_of_layer0 + core_allocation: [1] + spatial_mapping: + D1: + - C, 32 + D2: + - K, 32 + temporal_ordering: + - [OX, 112] # Innermost loop + - [OY, 112] + - [FX, 7] + - [FY, 7] + - [K, 2] # Outermost loop + memory_operand_links: + O: O + W: I2 + I: I1