From 17c6b11bcd7a4a8ddcbdf293b33bfe073d7c9bb8 Mon Sep 17 00:00:00 2001 From: LY-Mei Date: Thu, 5 Oct 2023 13:41:08 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20KULeuven?= =?UTF-8?q?-MICAS/zigzag@b9afa243402690d4061b1ab691764e81fec0431b=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .doctrees/environment.pickle | Bin 345295 -> 346320 bytes .doctrees/hardware.doctree | Bin 40060 -> 40935 bytes _sources/hardware.rst.txt | 3 ++- hardware.html | 2 +- searchindex.js | 2 +- 5 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index ba21efa1a926e3f847186ecd4e31d08dcdc5a03d..3f774d829faf88c7a1726470f51ab8f327cb3f03 100644 GIT binary patch delta 35752 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 M9`&wm?`p*UA7A`U8vpUlOq6qlW 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 CC@Z4? diff --git a/.doctrees/hardware.doctree b/.doctrees/hardware.doctree index 9e956880bfc072be549c140fc71c36ce52b4be22..f28f14235fc2879faf8a70e1b80d6a6fac5ab489 100644 GIT binary patch delta 2561 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 OJ6v8W9dS>ek^B#&`tIWZ diff --git a/_sources/hardware.rst.txt b/_sources/hardware.rst.txt index 7911c4ba..382ece3c 100644 --- a/_sources/hardware.rst.txt +++ b/_sources/hardware.rst.txt @@ -53,7 +53,8 @@ The memory instance object has the following attributes: * **latency**: The latency of memory access in the number of cycles, i.e., after requiring read/write a memory address, how many cycles the memory takes to provide/receive this corresponding data. (For now, this attribute is not actively used. We assume that it is 1 to model the data prefetching behavior thanks to the deterministic dataflow.) (optional) -* **min_r_granularity/min_w_granularity**: The minimal memory read/write granularity (in bit) the memory supports. This attribute is used to better model the memory that supports half-word access or a quarter-word access patterns. For example, if a memory's read bandwidth (wordlength) is 256 bit/cycle, its read energy (r_cost) is 100, and its min_r_granularity is 128 bits (i.e., assume this memory allow half-word read), read 128 bits from it will only take 50 energy. While if min_r_granularity is not defined or is defined as 256 bits, read 128 bits from it will take 100 energy. + +* **min_r_granularity/min_w_granularity**: The minimal memory read/write granularity (in bit) the memory supports. This attribute is used to better model the memory that supports half-word access or quarter-word access patterns. For example, if a memory's read bandwidth (wordlength) is 256 bit/cycle, its read energy (r_cost) is 100, and its min_r_granularity is 128 bits (i.e., assume this memory allow half-word read), read 128 bits from it (we approximatlly assume that) will only take 50 energy. While if min_r_granularity is not defined or is defined as 256 bits, read 128 bits from it will take 100 energy. Memory Hierarchy ---------------- diff --git a/hardware.html b/hardware.html index 973b1705..317940f8 100644 --- a/hardware.html +++ b/hardware.html @@ -1 +1 @@ - Hardware Architecture — ZigZag 2.0.0 documentation Skip to content

Hardware Architecture

In this section, we introduce the general concept of how HW accelerators are modeled within ZigZag and the different well-known accelerators we provide as examples. We start from the smallest building block defined in ZigZag and work our way up towards an accelerator.

Operational Unit

Accelerating inference of a NN requires the execution of multiplications and summations (accumulations) across multiple intermediate data (activations) using trained parameters (weights). The operational unit, typically a Multiplier, executes the multiplication of two data elements, typically an activation and a weight.

_images/operational-unit.jpg

The operational unit object has the following attributes:

  • input_precision: List of input operand (data) precision in the number of bits for each input operand (typically there are two input operands for a Multiplier).

  • output_precision: The bit precision of the operation’s output.

  • energy_cost: Energy of executing a single operation (e.g., a multiplication).

  • area: The HW area overhead of a single operational unit (e.g., a multiplier).

Operational Array

Inferencing a NN typically requires millions of operations, and an accelerator typically includes an array of operational units that can execute these operations in parallel. This can significantly speed up the computations, as well as increase energy efficiency which is covered later.

The array can have one or multiple dimensions, each with a size. The importance of these dimensions is explained in the introduction of the memory hierarchy.

_images/operational-array.jpg

The operational array object has the following attributes:

  • operational_unit: The operational unit from which the array is built.

  • dimensions: The dimensions of the array. This should be defined as a dict, with the keys being the identifier of each dimension of the array (typically ‘D1’, ‘D2’, …) and the values being the size of this dimension (i.e. the size of the array along that dimension).

Memory Instance

In order to store the different activations and weights used for the computations in the operational array, different memory instances are attached in a hierarchical fashion. The instances define how big each memory is in terms of capacity and area, what the cost of writing and reading from these memories is, what its bandwidth is, and how many read/write/read-write ports it includes.

_images/memory-instance.jpg

The memory instance object has the following attributes:

  • name: A name for the instance

  • size: The memory size in bits.

  • r_bw/w_bw: A read or write bandwidth in the number of bits per cycle.

  • r_cost/w_cost: A read or write energy cost.

  • area: Area overhead of the instance.

  • r_port/w_port/rw_port: The number of read/write/read-write ports the instance has available.

  • latency: The latency of memory access in the number of cycles, i.e., after requiring read/write a memory address, how many cycles the memory takes to provide/receive this corresponding data. (For now, this attribute is not actively used. We assume that it is 1 to model the data prefetching behavior thanks to the deterministic dataflow.)

(optional) * min_r_granularity/min_w_granularity: The minimal memory read/write granularity (in bit) the memory supports. This attribute is used to better model the memory that supports half-word access or a quarter-word access patterns. For example, if a memory’s read bandwidth (wordlength) is 256 bit/cycle, its read energy (r_cost) is 100, and its min_r_granularity is 128 bits (i.e., assume this memory allow half-word read), read 128 bits from it will only take 50 energy. While if min_r_granularity is not defined or is defined as 256 bits, read 128 bits from it will take 100 energy.

Memory Hierarchy

Besides knowing what the specs of each memory instance are, the memory hierarchy encodes information with respect to the interconnection of the memories to the operational array, and to the other memory instances. This interconnection is achieved through multiple calls to the add_memory(), where the first call(s) adds the first level of memories, which connects to the operational array, and later calls connect to the lower memory levels. This builds a hierarchy of memories.

To know if the memory should connect to the operational array or another lower memory level, it needs to know which data will be stored within the memories. To decouple the algorithmic side from the hardware side, this is achieved through the concept of ‘memory operands’ (as opposed to ‘algorithmic operands which are typicall the I/O activations and weights W). You can think of the memory operands as virtual operands, which will later be linked to the actual algorithmic operands in the mapping file through the memory_operand_links attribute.

Similarly to how the operational unit can be unrolled (forming an operational array), the memories can also be unrolled, where each memory accompanies either a single operational unit or all the operational units in one or more dimensions of the operational array. This is encoded through the served_dimensions attribute, which specifies if a single memory instance of this memory level serves all operational units in that dimension. This should be a set of one-hot-encoded tuples.

Lastly, the different read/write/read-write ports a memory instance has, are assigned to the different data movevements possible in the hierarchy. There are four types of data movements in a hierarchy: from high (fh), to high (th), from low (fl), to low (tl). At the time of writing, these can be manually linked to one of the read/write/read-write ports through the following syntax: {port_type}_port_{port_number}, port_type being r, w or rw and port_number equal to the port number, starting from 1, which allows to allocate multiple ports of the same type. Alternatively, these are automatically generated as a default if not probided to the add_memory() call.

Internally, the MemoryHierarchy object extends the NetworkX DiGraph object, so its methods are available.

_images/memory-hierarchy.jpg

The memory hierarchy object includes:

  • operational_array: The operational array to which this memory hierarchy will connect. This is required to correctly infer the interconnection through the operational array’s dimensions. Through the add_memory() calls it adds a new MemoryLevel to the graph. This requires for each call a:

  • memory_instance: A MemoryInstance object you are adding to the hierarchy.

  • operands: The virtual memory operands this MemoryLevel stores.

  • port_alloc: The directionality of the memory instance’s different ports, as described above.

  • served_dimensions: The different dimensions that this memory level will serve, as described above.

Core

The operational array and the memory hierarchy together form a core of the accelerator.

_images/core.jpg

The core object includes:

  • id: The id of this core.

  • operational_array: The operational array of this core.

  • memory_hierarchy: The memory hierarchy of this core.

HW Accelerator Model

Multiple cores are combined together into the HW Accelerator, which is the main object modeling the HW behavior.

The accelerator object includes:

  • name: A user-defined name for this accelerator.

  • core_set: The set of cores comprised within the accelerator.

  • global_buffer: A memory instance shared across cores. This is currently un-used.

Modelled examples

In this repository, we have modeled 5 well-known DNN accelerators, which are Meta prototype [1], TPU [2], Edge TPU [3], Ascend [4], Tesla NPU [5], and, for our depth-first scheduling research. To make a fair and relevant comparison, we normalized all of them to have 1024 MACs and maximally 2MB global buffer (GB) but kept their spatial unrolling and local buffer settings, as shown in Table I Idx 1/3/5/7/9. Besides, we constructed a variant of every normalized architecture (by changing its on-chip memory hierarchy), denoted with ‘DF’ in the end of the name, as shown in Table I Idx 2/4/6/8/10.

Specific settings

Alternative text

Note

K is for output channel; C is for input channel; OX and OY are the output feature map’s spatial dimensions; FX and FY are the weight’s spatial dimensions.

References

[1] H. E. Sumbul, T. F. Wu, Y. Li, S. S. Sarwar, W. Koven, E. Murphy- Trotzky, X. Cai, E. Ansari, D. H. Morris, H. Liu, D. Kim, E. Beigne, R. Labs, and Meta, “System-level design and integration of a prototype ar/vr hardware featuring a custom low-power dnn accelerator chip in 7nm technology for codec avatars,” in 2022 IEEE Custom Integrated Circuits Conference (CICC), 2022, pp. 01–08.

[2] N. P. Jouppi, C. Young, N. Patil, D. Patterson, G. Agrawal, R. Bajwa, S. Bates, S. Bhatia, N. Boden, A. Borchers, R. Boyle, P.-l. Cantin, C. Chao, C. Clark, J. Coriell, M. Daley, M. Dau, J. Dean, B. Gelb, T. V. Ghaemmaghami, R. Gottipati, W. Gulland, R. Hagmann, C. R. Ho, D. Hogberg, J. Hu, R. Hundt, D. Hurt, J. Ibarz, A. Jaffey, A. Jaworski, A. Kaplan, H. Khaitan, D. Killebrew, A. Koch, N. Kumar, S. Lacy, J. Laudon, J. Law, D. Le, C. Leary, Z. Liu, K. Lucke, A. Lundin, G. MacKean, A. Maggiore, M. Mahony, K. Miller, R. Nagarajan, R. Narayanaswami, R. Ni, K. Nix, T. Norrie, M. Omernick, N. Penukonda, A. Phelps, J. Ross, M. Ross, A. Salek, E. Samadiani, C. Severn, G. Sizikov, M. Snelham, J. Souter, D. Steinberg, A. Swing, M. Tan, G. Thorson, B. Tian, H. Toma, E. Tuttle, V. Vasudevan, R. Walter, W. Wang, E. Wilcox, and D. H. Yoon, “In-datacenter performance analysis of a tensor processing unit,” SIGARCH Comput. Archit. News, vol. 45, no. 2, p. 1–12, jun 2017.

[3] A. Yazdanbakhsh, K. Seshadri, B. Akin, J. Laudon, and R. Narayanaswami, “An Evaluation of Edge TPU Accelerators for Convolutional Neural Networks,” arXiv e-prints, p. arXiv:2102.10423, Feb. 2021.

[4] H. Liao, J. Tu, J. Xia, H. Liu, X. Zhou, H. Yuan, and Y. Hu, “Ascend: a scalable and unified architecture for ubiquitous deep neural network computing : Industry track paper,” in 2021 IEEE International Symposium on High-Performance Computer Architecture (HPCA), 2021, pp. 789–801.

[5] E. Talpes, D. D. Sarma, G. Venkataramanan, P. Bannon, B. McGee, B. Floering, A. Jalote, C. Hsiong, S. Arora, A. Gorti, and G. S. Sachdev, “Compute solution for tesla’s full self-driving computer,” IEEE Micro, vol. 40, no. 2, pp. 25–35, 2020.

\ No newline at end of file + Hardware Architecture — ZigZag 2.0.0 documentation Skip to content

Hardware Architecture

In this section, we introduce the general concept of how HW accelerators are modeled within ZigZag and the different well-known accelerators we provide as examples. We start from the smallest building block defined in ZigZag and work our way up towards an accelerator.

Operational Unit

Accelerating inference of a NN requires the execution of multiplications and summations (accumulations) across multiple intermediate data (activations) using trained parameters (weights). The operational unit, typically a Multiplier, executes the multiplication of two data elements, typically an activation and a weight.

_images/operational-unit.jpg

The operational unit object has the following attributes:

  • input_precision: List of input operand (data) precision in the number of bits for each input operand (typically there are two input operands for a Multiplier).

  • output_precision: The bit precision of the operation’s output.

  • energy_cost: Energy of executing a single operation (e.g., a multiplication).

  • area: The HW area overhead of a single operational unit (e.g., a multiplier).

Operational Array

Inferencing a NN typically requires millions of operations, and an accelerator typically includes an array of operational units that can execute these operations in parallel. This can significantly speed up the computations, as well as increase energy efficiency which is covered later.

The array can have one or multiple dimensions, each with a size. The importance of these dimensions is explained in the introduction of the memory hierarchy.

_images/operational-array.jpg

The operational array object has the following attributes:

  • operational_unit: The operational unit from which the array is built.

  • dimensions: The dimensions of the array. This should be defined as a dict, with the keys being the identifier of each dimension of the array (typically ‘D1’, ‘D2’, …) and the values being the size of this dimension (i.e. the size of the array along that dimension).

Memory Instance

In order to store the different activations and weights used for the computations in the operational array, different memory instances are attached in a hierarchical fashion. The instances define how big each memory is in terms of capacity and area, what the cost of writing and reading from these memories is, what its bandwidth is, and how many read/write/read-write ports it includes.

_images/memory-instance.jpg

The memory instance object has the following attributes:

  • name: A name for the instance

  • size: The memory size in bits.

  • r_bw/w_bw: A read or write bandwidth in the number of bits per cycle.

  • r_cost/w_cost: A read or write energy cost.

  • area: Area overhead of the instance.

  • r_port/w_port/rw_port: The number of read/write/read-write ports the instance has available.

  • latency: The latency of memory access in the number of cycles, i.e., after requiring read/write a memory address, how many cycles the memory takes to provide/receive this corresponding data. (For now, this attribute is not actively used. We assume that it is 1 to model the data prefetching behavior thanks to the deterministic dataflow.)

(optional)

  • min_r_granularity/min_w_granularity: The minimal memory read/write granularity (in bit) the memory supports. This attribute is used to better model the memory that supports half-word access or quarter-word access patterns. For example, if a memory’s read bandwidth (wordlength) is 256 bit/cycle, its read energy (r_cost) is 100, and its min_r_granularity is 128 bits (i.e., assume this memory allow half-word read), read 128 bits from it (we approximatlly assume that) will only take 50 energy. While if min_r_granularity is not defined or is defined as 256 bits, read 128 bits from it will take 100 energy.

Memory Hierarchy

Besides knowing what the specs of each memory instance are, the memory hierarchy encodes information with respect to the interconnection of the memories to the operational array, and to the other memory instances. This interconnection is achieved through multiple calls to the add_memory(), where the first call(s) adds the first level of memories, which connects to the operational array, and later calls connect to the lower memory levels. This builds a hierarchy of memories.

To know if the memory should connect to the operational array or another lower memory level, it needs to know which data will be stored within the memories. To decouple the algorithmic side from the hardware side, this is achieved through the concept of ‘memory operands’ (as opposed to ‘algorithmic operands which are typicall the I/O activations and weights W). You can think of the memory operands as virtual operands, which will later be linked to the actual algorithmic operands in the mapping file through the memory_operand_links attribute.

Similarly to how the operational unit can be unrolled (forming an operational array), the memories can also be unrolled, where each memory accompanies either a single operational unit or all the operational units in one or more dimensions of the operational array. This is encoded through the served_dimensions attribute, which specifies if a single memory instance of this memory level serves all operational units in that dimension. This should be a set of one-hot-encoded tuples.

Lastly, the different read/write/read-write ports a memory instance has, are assigned to the different data movevements possible in the hierarchy. There are four types of data movements in a hierarchy: from high (fh), to high (th), from low (fl), to low (tl). At the time of writing, these can be manually linked to one of the read/write/read-write ports through the following syntax: {port_type}_port_{port_number}, port_type being r, w or rw and port_number equal to the port number, starting from 1, which allows to allocate multiple ports of the same type. Alternatively, these are automatically generated as a default if not probided to the add_memory() call.

Internally, the MemoryHierarchy object extends the NetworkX DiGraph object, so its methods are available.

_images/memory-hierarchy.jpg

The memory hierarchy object includes:

  • operational_array: The operational array to which this memory hierarchy will connect. This is required to correctly infer the interconnection through the operational array’s dimensions. Through the add_memory() calls it adds a new MemoryLevel to the graph. This requires for each call a:

  • memory_instance: A MemoryInstance object you are adding to the hierarchy.

  • operands: The virtual memory operands this MemoryLevel stores.

  • port_alloc: The directionality of the memory instance’s different ports, as described above.

  • served_dimensions: The different dimensions that this memory level will serve, as described above.

Core

The operational array and the memory hierarchy together form a core of the accelerator.

_images/core.jpg

The core object includes:

  • id: The id of this core.

  • operational_array: The operational array of this core.

  • memory_hierarchy: The memory hierarchy of this core.

HW Accelerator Model

Multiple cores are combined together into the HW Accelerator, which is the main object modeling the HW behavior.

The accelerator object includes:

  • name: A user-defined name for this accelerator.

  • core_set: The set of cores comprised within the accelerator.

  • global_buffer: A memory instance shared across cores. This is currently un-used.

Modelled examples

In this repository, we have modeled 5 well-known DNN accelerators, which are Meta prototype [1], TPU [2], Edge TPU [3], Ascend [4], Tesla NPU [5], and, for our depth-first scheduling research. To make a fair and relevant comparison, we normalized all of them to have 1024 MACs and maximally 2MB global buffer (GB) but kept their spatial unrolling and local buffer settings, as shown in Table I Idx 1/3/5/7/9. Besides, we constructed a variant of every normalized architecture (by changing its on-chip memory hierarchy), denoted with ‘DF’ in the end of the name, as shown in Table I Idx 2/4/6/8/10.

Specific settings

Alternative text

Note

K is for output channel; C is for input channel; OX and OY are the output feature map’s spatial dimensions; FX and FY are the weight’s spatial dimensions.

References

[1] H. E. Sumbul, T. F. Wu, Y. Li, S. S. Sarwar, W. Koven, E. Murphy- Trotzky, X. Cai, E. Ansari, D. H. Morris, H. Liu, D. Kim, E. Beigne, R. Labs, and Meta, “System-level design and integration of a prototype ar/vr hardware featuring a custom low-power dnn accelerator chip in 7nm technology for codec avatars,” in 2022 IEEE Custom Integrated Circuits Conference (CICC), 2022, pp. 01–08.

[2] N. P. Jouppi, C. Young, N. Patil, D. Patterson, G. Agrawal, R. Bajwa, S. Bates, S. Bhatia, N. Boden, A. Borchers, R. Boyle, P.-l. Cantin, C. Chao, C. Clark, J. Coriell, M. Daley, M. Dau, J. Dean, B. Gelb, T. V. Ghaemmaghami, R. Gottipati, W. Gulland, R. Hagmann, C. R. Ho, D. Hogberg, J. Hu, R. Hundt, D. Hurt, J. Ibarz, A. Jaffey, A. Jaworski, A. Kaplan, H. Khaitan, D. Killebrew, A. Koch, N. Kumar, S. Lacy, J. Laudon, J. Law, D. Le, C. Leary, Z. Liu, K. Lucke, A. Lundin, G. MacKean, A. Maggiore, M. Mahony, K. Miller, R. Nagarajan, R. Narayanaswami, R. Ni, K. Nix, T. Norrie, M. Omernick, N. Penukonda, A. Phelps, J. Ross, M. Ross, A. Salek, E. Samadiani, C. Severn, G. Sizikov, M. Snelham, J. Souter, D. Steinberg, A. Swing, M. Tan, G. Thorson, B. Tian, H. Toma, E. Tuttle, V. Vasudevan, R. Walter, W. Wang, E. Wilcox, and D. H. Yoon, “In-datacenter performance analysis of a tensor processing unit,” SIGARCH Comput. Archit. News, vol. 45, no. 2, p. 1–12, jun 2017.

[3] A. Yazdanbakhsh, K. Seshadri, B. Akin, J. Laudon, and R. Narayanaswami, “An Evaluation of Edge TPU Accelerators for Convolutional Neural Networks,” arXiv e-prints, p. arXiv:2102.10423, Feb. 2021.

[4] H. Liao, J. Tu, J. Xia, H. Liu, X. Zhou, H. Yuan, and Y. Hu, “Ascend: a scalable and unified architecture for ubiquitous deep neural network computing : Industry track paper,” in 2021 IEEE International Symposium on High-Performance Computer Architecture (HPCA), 2021, pp. 789–801.

[5] E. Talpes, D. D. Sarma, G. Venkataramanan, P. Bannon, B. McGee, B. Floering, A. Jalote, C. Hsiong, S. Arora, A. Gorti, and G. S. Sachdev, “Compute solution for tesla’s full self-driving computer,” IEEE Micro, vol. 40, no. 2, pp. 25–35, 2020.

\ No newline at end of file diff --git a/searchindex.js b/searchindex.js index 918b4a1e..4a83fc0c 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["api", "code-documentation", "contribute", "future", "getting-started", "hardware", "index", "installation", "mapping", "outputs", "publications", "stages", "user-guide", "workload"], "filenames": ["api.rst", "code-documentation.rst", "contribute.rst", "future.rst", "getting-started.rst", "hardware.rst", "index.rst", "installation.rst", "mapping.rst", "outputs.rst", "publications.rst", "stages.rst", "user-guide.rst", "workload.rst"], "titles": ["ZigZag API", "Code Documentation", "Contribute", "Future changes", "Getting Started", "Hardware Architecture", "Welcome to ZigZag\u2019s documentation!", "Installing ZigZag", "Mapping", "Outputs", "Publications", "Stages", "User Guide", "Workload"], "terms": {"onc": [0, 7], "i": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13], "avail": [0, 2, 5, 7], "your": [0, 2, 7, 8], "python": [0, 2, 4, 7, 13], "path": [0, 4, 13], "you": [0, 2, 3, 4, 5, 7, 8, 9, 11, 13], "can": [0, 2, 3, 4, 5, 7, 8, 9, 11, 13], "import": [0, 2, 4, 5, 13], "ani": [0, 2, 7, 11], "file": [0, 2, 4, 5, 7, 8, 9, 11, 13], "from": [0, 5, 11, 13], "thi": [0, 1, 2, 4, 5, 6, 8, 9, 11, 13], "function": [0, 2, 7, 11], "take": [0, 3, 5, 7, 13], "an": [0, 2, 4, 5, 7, 9, 11], "workload": [0, 4, 6, 8, 11, 12], "hardwar": [0, 4, 6, 8, 11, 12, 13], "architectur": [0, 4, 6, 10, 11, 12], "map": [0, 3, 4, 5, 6, 9, 12], "return": [0, 9, 11], "perform": [0, 5, 10], "execut": [0, 2, 4, 5, 8, 11, 13], "model": [0, 3, 4, 6], "": [0, 2, 3, 4, 5, 8, 10, 11], "layer": [0, 4, 6, 8, 9, 11], "under": [0, 2, 4, 8], "given": [0, 4, 11], "constraint": [0, 4], "energi": [0, 3, 4, 5, 9, 10, 11], "latenc": [0, 3, 4, 5, 6, 9, 11], "cme": [0, 11], "acceler": [0, 4, 6, 8, 9, 10, 11, 13], "opt": 0, "dump_filename_pattern": [0, 4], "output": [0, 4, 5, 6, 11, 12, 13], "datetim": [0, 11], "json": [0, 9, 11], "pickle_filenam": 0, "list_of_cm": 0, "pickl": [0, 11], "The": [0, 1, 2, 4, 5, 6, 8, 9, 12, 13], "input": [0, 3, 4, 5, 8, 9, 13], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13], "A": [0, 5, 6, 8, 10, 13], "neural": [0, 5, 10], "network": [0, 4, 5, 10], "defin": [0, 4, 5, 9, 10, 11, 13], "onnx": [0, 3, 4, 8, 11], "format": [0, 1, 2, 9], "own": [0, 11, 13], "high": [0, 5, 10], "level": [0, 5, 11], "hw": [0, 3, 4, 6, 8, 11], "descript": [0, 8, 11], "specifi": [0, 5, 9], "core": [0, 4, 6, 8, 11, 13], "alloc": [0, 5, 8, 10, 11], "spatial": [0, 3, 5, 8, 9, 10, 13], "option": [0, 5], "tempor": [0, 3, 4, 6, 9], "order": [0, 2, 3, 5, 10, 11], "memori": [0, 3, 6, 8, 9, 10, 11, 13], "operand": [0, 5, 8, 13], "link": [0, 1, 5, 8, 13], "optim": [0, 4, 6, 10], "target": 0, "It": [0, 4, 9, 11, 13], "edp": [0, 11], "delai": 0, "product": 0, "name": [0, 4, 5, 8, 13], "result": [0, 6, 9], "which": [0, 4, 5, 8, 9, 11, 13], "includ": [0, 2, 3, 5, 9], "all": [0, 2, 4, 5, 9, 11, 13], "detail": [0, 2, 6, 7, 11], "metadata": 0, "analys": 0, "debug": 0, "number": [0, 5, 9], "indic": [0, 13], "overal": 0, "consum": 0, "run": [0, 2, 6, 7, 8, 11], "user": [0, 3, 4, 5, 6, 7, 11], "wai": [0, 1, 2, 4, 5, 9, 11, 13], "cycl": [0, 5], "count": 0, "collect": 0, "cost": [0, 3, 4, 5, 6, 13], "evalu": [0, 5, 11], "stand": 0, "we": [0, 2, 3, 4, 5, 11], "demonstr": 0, "how": [0, 2, 4, 5, 7, 8, 9, 11], "us": [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 13], "multipl": [0, 5, 6, 10, 11, 13], "demo": 0, "comment": [1, 2], "within": [1, 5, 8, 11, 13], "sourc": [1, 2], "zigzag": [1, 4, 5, 8, 9, 11, 12, 13], "framework": [1, 2, 4, 6, 7, 8, 10, 11, 12, 13], "support": [1, 3, 4, 5, 6, 11], "auto": [1, 10], "doxygen": 1, "automat": [1, 4, 5, 6, 8, 11, 13], "updat": [1, 2, 3, 11], "soon": 1, "somebodi": 1, "push": 1, "someth": 1, "master": 1, "branch": 1, "github": [1, 7, 10], "repo": [1, 13], "project": [1, 6, 10], "follow": [1, 2, 4, 5, 8, 9, 11, 12, 13], "access": [1, 3, 5], "latest": 1, "version": [1, 6, 11], "when": [2, 8, 11, 13], "pleas": [2, 9, 11], "consid": 2, "googl": 2, "style": 2, "guid": [2, 3, 6], "docstr": 2, "class": [2, 3, 11], "method": [2, 5, 9], "exampl": [2, 4, 8, 9, 11, 13], "found": [2, 11, 13], "throughout": 2, "here": [2, 3, 4, 8, 10, 13], "accordingli": 2, "In": [2, 4, 5, 6, 9, 11, 13], "packag": [2, 6], "call": [2, 5], "bumpver": 2, "twine": 2, "These": [2, 11], "instal": [2, 6], "pip": [2, 7], "first": [2, 5, 6, 11], "pull": 2, "make": [2, 3, 5, 7, 9], "sure": 2, "have": [2, 4, 5, 11, 13], "remot": 2, "cahng": 2, "merg": 2, "conflict": 2, "chang": [2, 5, 6, 11], "commit": 2, "Then": [2, 13], "command": [2, 4, 13], "patch": 2, "m": [2, 5, 10], "upload": 2, "dist": 2, "zigzag_ds": 2, "x": [2, 5], "y": [2, 5], "z": [2, 5], "whl": 2, "dse": [2, 6, 7], "tar": 2, "gz": 2, "provid": [2, 4, 5, 6, 7, 8, 11, 12, 13], "sever": 2, "differ": [2, 4, 5, 6, 9, 11, 13], "There": [2, 5, 9], "mani": [2, 5], "public": [2, 6], "relat": 2, "page": [2, 6], "allow": [2, 5, 8], "everyon": 2, "get": [2, 6, 7], "familiar": 2, "more": [2, 3, 4, 5, 7, 11, 12, 13], "about": [2, 9, 11], "implement": 2, "ad": [2, 5, 8], "mandatori": 2, "what": [2, 5, 8, 9, 11], "doe": 2, "achiev": [2, 5], "newli": 2, "explicit": 2, "resid": [2, 11], "doc": 2, "folder": [2, 11], "restructuredtext": 2, "rst": 2, "decid": 2, "would": [2, 13], "best": [2, 11], "fit": 2, "exist": [2, 11], "one": [2, 4, 5, 11], "If": [2, 7, 9, 11, 13], "creat": [2, 8], "lower": [2, 5], "case": [2, 3, 6, 13], "letter": [2, 13], "hyphen": 2, "between": [2, 4, 6, 13], "word": [2, 5], "after": [2, 5, 7, 11], "need": [2, 4, 5, 8, 13], "add": [2, 3, 5, 7, 13], "toctre": 2, "index": [2, 6], "same": [2, 3, 5], "webpag": 2, "sphinx": 2, "should": [2, 5, 8, 9, 13], "both": [2, 3], "press": 2, "theme": 2, "easi": [2, 9], "through": [2, 4, 5, 6, 7, 8, 10, 11, 13], "requir": [2, 4, 5, 7, 8, 9, 11, 13], "txt": [2, 7], "cd": 2, "r": [2, 5, 7], "simpli": [2, 11], "b": [2, 5, 13], "html": 2, "entri": [2, 8], "point": [2, 6], "guidlin": 2, "paramet": [2, 5, 11], "constructor": 2, "download": 2, "describ": [2, 5, 13], "successfulli": 2, "configur": [2, 10], "done": 2, "either": [2, 5], "gui": 2, "conf": 2, "find": [3, 4, 6, 11], "plan": 3, "oper": [3, 8, 11], "ancestor": 3, "layernod": [3, 13], "dummynod": [3, 13], "fix": 3, "loop": [3, 10, 11, 13], "multi": [3, 6], "dimension": 3, "unrol": [3, 5], "fraction": 3, "account": [3, 11, 13], "bandwidth": [3, 5], "loma": [3, 4, 10, 11], "memoryalloc": 3, "besid": [3, 4, 5, 11], "capac": [3, 5], "lpf": 3, "limit": [3, 10], "visualis": 3, "tutori": 3, "remak": 3, "tabl": [3, 5], "without": 3, "df": [3, 5], "stage": [3, 4, 6, 9, 12], "stack": 3, "combin": [3, 5, 8, 9, 11], "common": 3, "versatil": 4, "tool": 4, "estim": [4, 6], "dl": [4, 6], "design": [4, 5, 6, 11], "multitud": 4, "set": [4, 11], "As": [4, 11], "step": [4, 11], "nn": [4, 5, 13], "onto": [4, 6, 8], "go": 4, "alexnet": 4, "ha": [4, 5, 11, 12, 13], "been": 4, "shape": 4, "infer": [4, 5], "mean": 4, "tensor": [4, 5, 13], "intermedi": [4, 5, 13], "inform": [4, 5, 8, 9, 11, 12, 13], "know": [4, 5, 8, 9, 13], "correctli": [4, 5, 13], "tpu": [4, 5], "like": [4, 11, 13], "tpu_lik": 4, "py": [4, 8, 11, 13], "must": [4, 11], "suggest": 4, "resourc": [4, 6, 8], "alexnet_on_tpu_lik": 4, "gener": [4, 5, 6, 8, 9, 11, 12], "ran": 4, "main": [4, 5, 7, 9, 13], "pars": [4, 11, 13], "contain": [4, 8, 13], "program": 4, "flow": [4, 11], "document": [4, 7, 11, 12], "main_onnx": [4, 13], "note": [4, 9], "construct": [4, 5], "becaus": 4, "object": [4, 5, 9, 11, 13], "respect": [4, 5, 9], "modul": [4, 6], "other": [4, 5, 11, 13], "also": [4, 5, 7, 8, 9, 11, 13], "see": [4, 9, 13], "section": [4, 5, 9, 11], "manual": [4, 5, 6, 8, 11], "definit": [4, 8, 9, 11], "resnet18": [4, 8, 13], "salsa": [4, 11], "search": [4, 6], "engin": [4, 6, 11], "util": [4, 9], "schedul": [4, 5, 6, 11], "than": 4, "main_onnx_salsa": 4, "dure": 4, "save": [4, 9], "depend": [4, 7, 13], "total": [4, 11], "five": [4, 12], "each": [4, 5, 9, 11, 13], "node": [4, 8, 9, 11], "onnxmodelparserstag": [4, 8, 11, 13], "wa": 4, "minimallatencystag": [4, 11], "refer": [4, 13], "introduc": 5, "concept": [5, 11], "well": 5, "known": 5, "start": [5, 6, 7, 11], "smallest": 5, "build": [5, 12, 13], "block": [5, 12], "work": [5, 9], "our": [5, 11], "up": [5, 11], "toward": [5, 10], "summat": 5, "accumul": 5, "across": [5, 10, 11], "data": [5, 9], "activ": 5, "train": 5, "weight": [5, 13], "typic": [5, 8], "multipli": 5, "two": [5, 9], "element": [5, 11], "attribut": [5, 9, 13], "input_precis": 5, "list": [5, 11, 13], "precis": [5, 13], "bit": [5, 13], "output_precis": 5, "energy_cost": 5, "singl": [5, 11], "e": [5, 8, 10, 11, 13], "g": [5, 8, 11], "area": [5, 10], "overhead": 5, "inferenc": 5, "million": 5, "parallel": [5, 8, 13], "significantli": 5, "speed": 5, "comput": [5, 6, 8, 10, 13], "increas": 5, "effici": 5, "cover": 5, "later": [5, 11], "dimens": [5, 11, 13], "size": [5, 13], "explain": [5, 9, 11], "introduct": 5, "operational_unit": 5, "built": 5, "dict": 5, "kei": [5, 8], "being": [5, 11], "identifi": 5, "d1": 5, "d2": 5, "valu": [5, 11, 13], "along": 5, "store": 5, "attach": 5, "hierarch": 5, "fashion": 5, "big": 5, "term": 5, "write": [5, 8], "read": [5, 13], "its": [5, 7, 9, 11], "port": 5, "r_bw": 5, "w_bw": 5, "per": 5, "r_cost": 5, "w_cost": 5, "r_port": 5, "w_port": 5, "rw_port": 5, "address": 5, "receiv": [5, 11], "correspond": [5, 11], "For": [5, 11, 13], "now": 5, "assum": [5, 13], "1": [5, 10], "prefetch": 5, "behavior": 5, "thank": 5, "determinist": 5, "dataflow": [5, 10], "min_r_granular": 5, "min_w_granular": 5, "minim": [5, 11], "granular": 5, "better": 5, "half": 5, "quarter": 5, "pattern": [5, 11], "wordlength": 5, "256": 5, "100": 5, "128": 5, "onli": [5, 9, 11, 13], "50": 5, "while": [5, 11], "spec": [5, 7], "encod": [5, 8], "interconnect": [5, 11], "add_memori": 5, "where": [5, 11, 13], "connect": [5, 11], "To": [5, 11], "anoth": [5, 11], "decoupl": 5, "algorithm": [5, 6, 8, 10, 13], "side": [5, 13], "oppos": 5, "typical": 5, "o": [5, 8, 13], "w": [5, 8, 10], "think": [5, 11], "virtual": [5, 13], "actual": [5, 13], "memory_operand_link": [5, 8, 13], "similarli": 5, "form": 5, "accompani": 5, "served_dimens": 5, "serv": [5, 11], "hot": 5, "tupl": [5, 11], "lastli": 5, "assign": 5, "movev": 5, "possibl": [5, 13], "four": 5, "type": [5, 12, 13], "movement": 5, "fh": 5, "th": 5, "low": 5, "fl": 5, "tl": 5, "At": 5, "time": [5, 8], "syntax": 5, "port_typ": 5, "_port_": 5, "port_numb": 5, "rw": 5, "equal": 5, "altern": [5, 7, 13], "default": [5, 8], "probid": 5, "intern": [5, 7, 10, 11], "memoryhierarchi": 5, "extend": 5, "networkx": 5, "digraph": 5, "so": [5, 11, 13], "operational_arrai": 5, "new": [5, 6, 11], "memorylevel": 5, "graph": [5, 11, 13], "memory_inst": 5, "memoryinst": 5, "port_alloc": 5, "direction": 5, "abov": 5, "togeth": [5, 13], "id": [5, 8, 13], "memory_hierarchi": 5, "core_set": 5, "compris": 5, "global_buff": 5, "share": 5, "current": [5, 9], "un": 5, "repositori": [5, 7], "5": 5, "dnn": [5, 10], "meta": 5, "prototyp": 5, "2": 5, "edg": [5, 13], "3": [5, 7], "ascend": 5, "4": [5, 10], "tesla": 5, "npu": 5, "depth": [5, 6], "research": 5, "fair": 5, "relev": [5, 9], "comparison": 5, "normal": 5, "them": [5, 11], "1024": [5, 13], "mac": 5, "maxim": 5, "2mb": 5, "global": 5, "buffer": 5, "gb": 5, "kept": 5, "local": 5, "shown": 5, "idx": 5, "7": 5, "9": 5, "variant": 5, "everi": [5, 8], "chip": 5, "denot": 5, "end": [5, 7, 11], "6": [5, 10, 11], "8": [5, 7, 10], "10": [5, 10], "k": [5, 10, 13], "channel": [5, 13], "c": [5, 13], "ox": [5, 13], "oi": [5, 13], "featur": 5, "fx": [5, 13], "fy": [5, 13], "h": [5, 10], "sumbul": [5, 10], "t": [5, 8, 10, 13], "f": 5, "wu": [5, 10], "li": 5, "sarwar": 5, "koven": 5, "murphi": 5, "trotzki": 5, "cai": 5, "ansari": 5, "d": [5, 10], "morri": 5, "liu": [5, 10], "kim": 5, "beign": [5, 10], "lab": 5, "system": [5, 10, 11], "integr": [5, 10], "vr": 5, "custom": [5, 7, 8, 13], "power": 5, "7nm": 5, "technologi": 5, "codec": 5, "avatar": 5, "2022": [5, 10], "ieee": [5, 10], "circuit": [5, 10], "confer": [5, 10], "cicc": 5, "pp": [5, 10], "01": 5, "08": 5, "n": [5, 10], "p": [5, 10], "jouppi": 5, "young": 5, "patil": 5, "patterson": 5, "agraw": 5, "bajwa": 5, "bate": 5, "bhatia": 5, "boden": 5, "borcher": 5, "boyl": 5, "l": [5, 10], "cantin": 5, "chao": 5, "clark": 5, "j": 5, "coriel": 5, "dalei": 5, "dau": 5, "dean": 5, "gelb": 5, "v": [5, 10], "ghaemmaghami": 5, "gottipati": 5, "gulland": 5, "hagmann": 5, "ho": 5, "hogberg": 5, "hu": 5, "hundt": 5, "hurt": 5, "ibarz": 5, "jaffei": 5, "jaworski": 5, "kaplan": 5, "khaitan": 5, "killebrew": 5, "koch": 5, "kumar": 5, "laci": 5, "laudon": 5, "law": 5, "le": 5, "leari": 5, "luck": 5, "lundin": 5, "mackean": 5, "maggior": 5, "mahoni": 5, "miller": 5, "nagarajan": 5, "narayanaswami": 5, "ni": 5, "nix": 5, "norri": 5, "omernick": 5, "penukonda": 5, "phelp": 5, "ross": 5, "salek": 5, "samadiani": 5, "severn": 5, "sizikov": 5, "snelham": 5, "souter": 5, "steinberg": 5, "swing": 5, "tan": 5, "thorson": 5, "tian": 5, "toma": 5, "tuttl": 5, "vasudevan": 5, "walter": 5, "wang": 5, "wilcox": 5, "yoon": 5, "datacent": 5, "analysi": 5, "process": [5, 11], "sigarch": 5, "archit": 5, "vol": [5, 10], "45": 5, "12": 5, "jun": 5, "2017": 5, "yazdanbakhsh": 5, "seshadri": 5, "akin": 5, "convolut": [5, 8, 13], "arxiv": [5, 10], "print": [5, 10], "2102": 5, "10423": 5, "feb": 5, "2021": [5, 10], "liao": 5, "tu": 5, "xia": 5, "zhou": 5, "yuan": 5, "scalabl": 5, "unifi": 5, "ubiquit": 5, "deep": [5, 6, 10], "industri": 5, "track": 5, "paper": [5, 10, 13], "symposium": [5, 10], "hpca": [5, 10], "789": 5, "801": 5, "talp": 5, "sarma": 5, "venkataramanan": 5, "bannon": 5, "mcgee": 5, "floer": 5, "jalot": 5, "hsiong": 5, "arora": 5, "gorti": 5, "sachdev": 5, "solut": 5, "full": 5, "self": [5, 9], "drive": 5, "micro": 5, "40": 5, "25": 5, "35": 5, "2020": [5, 10], "space": [6, 11], "explor": [6, 11], "learn": 6, "bridg": 6, "gap": 6, "decis": 6, "special": 6, "fast": [6, 10], "accur": 6, "analyt": [6, 10], "crucial": 6, "part": [6, 8], "clone": 6, "analyz": [6, 10], "api": [6, 7], "get_hardware_performance_zigzag": 6, "futur": 6, "contribut": [6, 13], "guidelin": [6, 13], "upgrad": 6, "develop": 6, "idea": 6, "explan": 6, "studi": 6, "extens": 6, "cross": 6, "fuse": 6, "code": 6, "re": 7, "interest": [7, 11], "modif": [7, 9], "directli": 7, "venv": 7, "conda": 7, "environ": 7, "look": [7, 11], "want": [7, 8, 11, 13], "git": 7, "com": 7, "kuleuven": 7, "mica": 7, "http": 7, "anaconda": 7, "argument": [7, 11], "autom": [8, 10], "some": [8, 11, 13], "aspect": [8, 9, 11], "interfac": 8, "core_alloc": [8, 13], "spatial_map": [8, 9, 13], "strategi": [8, 13], "spatialmappinggeneratorstag": [8, 11, 13], "hierarchi": [8, 9, 11], "extra": [8, 11], "flexibl": 8, "scheme": 8, "don": 8, "put": 8, "safe": 8, "bet": 8, "copi": [8, 11], "exact": 8, "detect": 8, "dictionari": [8, 13], "interpret": 9, "predefin": 9, "costmodelevalu": [9, 11], "knowledg": 9, "irrelev": 9, "handl": 9, "complexhandl": 9, "insid": [9, 11, 13], "represent": [9, 11], "invok": 9, "pass": 9, "__simplejsonrepr__": 9, "convert": [9, 11, 13], "off": [9, 10], "load": [9, 13], "reli": 9, "def": 9, "simpl": [9, 11], "energy_tot": 9, "latency_total2": 9, "standard": 9, "filename_pattern": [9, 11], "lose": 9, "etc": [9, 11], "concern": 9, "__jsonrepr__": 9, "temporal_map": 9, "mem_utili_shar": 9, "word_access": 9, "memory_word_access": 9, "operational_energi": 9, "mac_energi": 9, "memory_energi": 9, "mem_energi": 9, "energy_breakdown_per_level": 9, "energy_breakdown": 9, "energy_breakdown_per_level_per_operand": 9, "energy_breakdown_furth": 9, "latency_without_onloading_without_offload": 9, "latency_total0": 9, "latency_with_onloading_without_offload": 9, "latency_total1": 9, "latency_with_onloading_with_offload": 9, "goal": [9, 11], "straightforward": 9, "care": 9, "certain": 9, "modifi": [9, 11], "parser": 9, "pointer": 10, "mei": 10, "houshmand": 10, "jain": 10, "giraldo": 10, "verhelst": 10, "enlarg": 10, "joint": 10, "transact": 10, "70": 10, "1160": 10, "1174": 10, "aug": 10, "doi": 10, "1109": 10, "tc": 10, "3059962": 10, "uniform": 10, "divers": 10, "test": 10, "europ": 10, "exhibit": 10, "date": 10, "antwerp": 10, "belgium": 10, "220": 10, "225": 10, "23919": 10, "date54114": 10, "9774728": 10, "slide": 10, "video": 10, "symon": 10, "base": [10, 11], "3rd": 10, "artifici": 10, "intellig": 10, "aica": 10, "washington": 10, "dc": 10, "usa": 10, "aicas51828": 10, "9458493": 10, "coseman": 10, "papista": 10, "bhattacharje": 10, "deback": 10, "mallik": 10, "verkest": 10, "opportun": 10, "emerg": 10, "analog": 10, "electron": 10, "devic": 10, "meet": 10, "iedm": 10, "san": 10, "francisco": 10, "ca": 10, "29": 10, "iedm13553": 10, "9372006": 10, "accuraci": 10, "trade": 10, "contemporari": 10, "9458553": 10, "colleman": 10, "verelst": 10, "tuytelaar": 10, "processor": 10, "dynam": 10, "ifip": 10, "29th": 10, "veri": 10, "larg": [10, 13], "scale": 10, "vlsi": 10, "soc": 10, "singapor": 10, "soc53125": 10, "9607013": 10, "zhu": 10, "sun": 10, "mobil": 10, "transform": 10, "4th": 10, "incheon": 10, "korea": 10, "republ": 10, "142": 10, "145": 10, "aicas54282": 10, "9869945": 10, "goetschalckx": 10, "enabl": 10, "2023": 10, "karl": 10, "heterogen": 10, "exploit": 10, "fine": 10, "grain": 10, "48550": 10, "2212": 10, "10612": 10, "fasfou": 10, "genet": 10, "date56975": 10, "10137070": 10, "modularli": 11, "easili": 11, "adapt": 11, "sequenc": 11, "determin": 11, "mainstag": 11, "initi": 11, "acceleratorparserstag": 11, "simplesavestag": 11, "workloadstag": 11, "sm": 11, "lomastag": 11, "tm": 11, "costmodelstag": 11, "accelerator_path": 11, "arg": 11, "onnx_model_path": 11, "mapping_path": 11, "loma_lpf_limit": 11, "loma_show_progress_bar": 11, "true": [11, 13], "show": 11, "progress": 11, "bar": 11, "over": 11, "similar": 11, "those": 11, "pipelin": [11, 13], "remain": 11, "said": 11, "further": 11, "label": 11, "below": 11, "fed": 11, "far": 11, "discuss": 11, "last": 11, "revers": 11, "hold": 11, "finish": 11, "conbim": 11, "yield": 11, "chain": 11, "manipul": 11, "invoc": 11, "lowest": 11, "still": 11, "miss": 11, "__init__": 11, "workloadparserstag": 11, "workload_path": 11, "generalparameteriteratorstag": 11, "whose": 11, "predetermin": 11, "plottemporalmappingsstag": 11, "substag": 11, "keep": 11, "minimalenergystag": 11, "list_of_cal": 11, "minimaledpstag": 11, "sumstag": 11, "sum": 11, "listifystag": 11, "instead": [11, 13], "removeextrainfostag": 11, "strip": 11, "info": 11, "subcal": 11, "cachebeforeyieldstag": 11, "cach": 11, "break": 11, "top": 11, "bottom": 11, "skipifdumpexistsstag": 11, "check": 11, "alreadi": 11, "skip": 11, "multiprocessingspawnstag": 11, "multiprocess": 11, "multiprocessinggatherstag": 11, "completesavestag": 11, "picklesavestag": 11, "dumpstag": 11, "salsastag": 11, "simul": 11, "anneal": 11, "temporalorderingconversionstag": 11, "spatialmappingconversionstag": 11, "auser": 11, "arrai": 11, "present": [11, 13], "inner": 11, "most": 11, "config": 11, "let": 11, "sai": 11, "metric": 11, "easiest": 11, "accord": 11, "intend": 11, "behaviour": 11, "guarante": 11, "correct": 11, "taken": 11, "inherit": 11, "abstract": 11, "callabl": 11, "kwarg": 11, "second": 11, "extra_info": 11, "reduct": 11, "statement": 11, "outsid": 11, "happen": 11, "regard": 12, "major": 12, "compon": 12, "recommend": 13, "context": 13, "ml": 13, "often": 13, "recogn": 13, "complet": 13, "conv": 13, "qlinearconv": 13, "matmul": 13, "gemm": 13, "accelerat": 13, "incur": 13, "zero": 13, "feel": 13, "free": 13, "open": 13, "issu": 13, "yourself": 13, "rather": 13, "avoid": 13, "origin": 13, "discard": 13, "doesn": 13, "do": 13, "onnx_model": 13, "modelproto": 13, "my_model_with_internal_data": 13, "save_model": 13, "save_as_external_data": 13, "all_tensors_to_one_fil": 13, "locat": 13, "external_data_filenam": 13, "size_threshold": 13, "convert_attribut": 13, "fals": 13, "raw": 13, "specif": 13, "directori": 13, "shape_infer": 13, "my_model": 13, "inferred_model": 13, "infer_shap": 13, "my_inferred_model": 13, "moreov": 13, "repres": 13, "equat": 13, "small": 13, "wherea": 13, "alwai": 13, "freeli": 13, "dimension_rel": 13, "relationship": 13, "stride": 13, "filter": 13, "dilat": 13, "rate": 13, "loop_dim_s": 13, "left": 13, "hand": 13, "operand_precis": 13, "partial": 13, "o_fin": 13, "final": 13, "operand_sourc": 13, "come": 13, "constant_operand": 13, "constant": 13, "prior": 13, "none": 13, "readm": 13, "notat": 13, "batch": 13, "row": 13, "column": 13, "kernel": 13}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"zigzag": [0, 2, 6, 7, 10], "api": 0, "get_hardware_performance_zigzag": 0, "code": [1, 2], "document": [1, 2, 3, 6], "contribut": 2, "guidelin": 2, "upgrad": 2, "project": 2, "version": 2, "develop": 2, "write": 2, "new": [2, 10], "part": 2, "gener": [2, 10], "build": 2, "local": 2, "which": 2, "support": [2, 10, 13], "doxygen": 2, "futur": 3, "chang": 3, "framework": 3, "get": 4, "start": 4, "first": [4, 10], "run": 4, "analyz": 4, "result": [4, 11], "hardwar": 5, "architectur": 5, "oper": [5, 13], "unit": 5, "arrai": 5, "memori": 5, "instanc": 5, "hierarchi": 5, "core": [5, 10], "hw": 5, "acceler": 5, "model": [5, 10, 11, 13], "exampl": 5, "specif": 5, "set": 5, "refer": 5, "welcom": 6, "": [6, 13], "content": 6, "indic": 6, "tabl": 6, "instal": 7, "packag": 7, "manual": [7, 13], "clone": 7, "prerequisit": 7, "map": [8, 10, 11], "user": [8, 12], "defin": 8, "constraint": 8, "output": 9, "simplesavestag": 9, "completesavestag": 9, "creat": [9, 11], "custom": [9, 11], "savestag": 9, "public": 10, "The": [10, 11], "idea": 10, "detail": 10, "latenc": 10, "explan": 10, "tempor": [10, 11], "search": 10, "engin": 10, "differ": 10, "design": 10, "space": 10, "explor": 10, "case": 10, "studi": 10, "extens": 10, "cross": 10, "layer": [10, 13], "depth": 10, "schedul": 10, "multi": 10, "fuse": 10, "stage": 11, "introduct": 11, "main": 11, "entri": 11, "point": 11, "sequenti": 11, "call": 11, "back": 11, "pass": 11, "implement": 11, "input": 11, "parser": 11, "iter": 11, "plot": 11, "reduc": 11, "optim": 11, "save": [11, 13], "dump": 11, "spatial": 11, "cost": 11, "your": [11, 13], "guid": 12, "workload": 13, "onnx": 13, "extern": 13, "data": 13, "infer": 13, "an": 13, "shape": 13, "definit": 13}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 58}, "alltitles": {"ZigZag API": [[0, "zigzag-api"]], "get_hardware_performance_zigzag()": [[0, "get-hardware-performance-zigzag"]], "Code Documentation": [[1, "code-documentation"]], "Contribute": [[2, "contribute"]], "Contributing guidelines": [[2, "contributing-guidelines"]], "Upgrading the project version (for ZigZag developers)": [[2, "upgrading-the-project-version-for-zigzag-developers"]], "Documentation": [[2, "documentation"], [3, "documentation"]], "Writing new parts for the general documentation": [[2, "writing-new-parts-for-the-general-documentation"]], "Building the general documentation locally": [[2, "building-the-general-documentation-locally"]], "Writing code which supports the code documentation with Doxygen": [[2, "writing-code-which-supports-the-code-documentation-with-doxygen"]], "Building the code documentation locally": [[2, "building-the-code-documentation-locally"]], "Future changes": [[3, "future-changes"]], "Framework": [[3, "framework"]], "Getting Started": [[4, "getting-started"]], "First run": [[4, "first-run"]], "Analyzing results": [[4, "analyzing-results"]], "Hardware Architecture": [[5, "hardware-architecture"]], "Operational Unit": [[5, "operational-unit"]], "Operational Array": [[5, "operational-array"]], "Memory Instance": [[5, "memory-instance"]], "Memory Hierarchy": [[5, "memory-hierarchy"]], "Core": [[5, "core"]], "HW Accelerator Model": [[5, "hw-accelerator-model"]], "Modelled examples": [[5, "modelled-examples"]], "Specific settings": [[5, "specific-settings"]], "References": [[5, "references"]], "Welcome to ZigZag\u2019s documentation!": [[6, "welcome-to-zigzag-s-documentation"]], "Contents:": [[6, null]], "Indices and tables": [[6, "indices-and-tables"]], "Installing ZigZag": [[7, "installing-zigzag"]], "Installing as a package": [[7, "installing-as-a-package"]], "Manual clone": [[7, "manual-clone"]], "Prerequisites": [[7, "prerequisites"]], "Installation": [[7, "installation"]], "Mapping": [[8, "mapping"]], "User-defined mapping constraints": [[8, "user-defined-mapping-constraints"]], "Outputs": [[9, "outputs"]], "SimpleSaveStage": [[9, "simplesavestage"]], "CompleteSaveStage": [[9, "completesavestage"]], "Creating a custom SaveStage": [[9, "creating-a-custom-savestage"]], "Publications": [[10, "publications"]], "The general idea of ZigZag": [[10, "the-general-idea-of-zigzag"]], "Detailed latency model explanation": [[10, "detailed-latency-model-explanation"]], "The new temporal mapping search engine": [[10, "the-new-temporal-mapping-search-engine"]], "Different design space exploration case studies": [[10, "different-design-space-exploration-case-studies"]], "Extension to support cross-layer depth-first scheduling": [[10, "extension-to-support-cross-layer-depth-first-scheduling"]], "Extension to support multi-core layer-fused scheduling": [[10, "extension-to-support-multi-core-layer-fused-scheduling"]], "Stages": [[11, "stages"]], "Introduction": [[11, "introduction"]], "The main entry point": [[11, "the-main-entry-point"]], "The sequential call of stages": [[11, "the-sequential-call-of-stages"]], "The back passing of results": [[11, "the-back-passing-of-results"]], "Implemented stages": [[11, "implemented-stages"]], "Input parser stages": [[11, "input-parser-stages"]], "Iterator stage": [[11, "iterator-stage"]], "Plot stages": [[11, "plot-stages"]], "Reduce stages": [[11, "reduce-stages"]], "Optimization stages": [[11, "optimization-stages"]], "Save and dump stages": [[11, "save-and-dump-stages"]], "Temporal mapping stages": [[11, "temporal-mapping-stages"]], "Spatial mapping stages": [[11, "spatial-mapping-stages"]], "Cost model stages": [[11, "cost-model-stages"]], "Creating your custom stage": [[11, "creating-your-custom-stage"]], "User Guide": [[12, "user-guide"]], "Workload": [[13, "workload"]], "Onnx models": [[13, "onnx-models"]], "Supported onnx operators": [[13, "supported-onnx-operators"]], "Saving your onnx model with external data": [[13, "saving-your-onnx-model-with-external-data"]], "Inferring an onnx model\u2019s shapes": [[13, "inferring-an-onnx-model-s-shapes"]], "Manual layer definition": [[13, "manual-layer-definition"]]}, "indexentries": {}}) \ No newline at end of file +Search.setIndex({"docnames": ["api", "code-documentation", "contribute", "future", "getting-started", "hardware", "index", "installation", "mapping", "outputs", "publications", "stages", "user-guide", "workload"], "filenames": ["api.rst", "code-documentation.rst", "contribute.rst", "future.rst", "getting-started.rst", "hardware.rst", "index.rst", "installation.rst", "mapping.rst", "outputs.rst", "publications.rst", "stages.rst", "user-guide.rst", "workload.rst"], "titles": ["ZigZag API", "Code Documentation", "Contribute", "Future changes", "Getting Started", "Hardware Architecture", "Welcome to ZigZag\u2019s documentation!", "Installing ZigZag", "Mapping", "Outputs", "Publications", "Stages", "User Guide", "Workload"], "terms": {"onc": [0, 7], "i": [0, 2, 4, 5, 6, 7, 8, 9, 10, 11, 13], "avail": [0, 2, 5, 7], "your": [0, 2, 7, 8], "python": [0, 2, 4, 7, 13], "path": [0, 4, 13], "you": [0, 2, 3, 4, 5, 7, 8, 9, 11, 13], "can": [0, 2, 3, 4, 5, 7, 8, 9, 11, 13], "import": [0, 2, 4, 5, 13], "ani": [0, 2, 7, 11], "file": [0, 2, 4, 5, 7, 8, 9, 11, 13], "from": [0, 5, 11, 13], "thi": [0, 1, 2, 4, 5, 6, 8, 9, 11, 13], "function": [0, 2, 7, 11], "take": [0, 3, 5, 7, 13], "an": [0, 2, 4, 5, 7, 9, 11], "workload": [0, 4, 6, 8, 11, 12], "hardwar": [0, 4, 6, 8, 11, 12, 13], "architectur": [0, 4, 6, 10, 11, 12], "map": [0, 3, 4, 5, 6, 9, 12], "return": [0, 9, 11], "perform": [0, 5, 10], "execut": [0, 2, 4, 5, 8, 11, 13], "model": [0, 3, 4, 6], "": [0, 2, 3, 4, 5, 8, 10, 11], "layer": [0, 4, 6, 8, 9, 11], "under": [0, 2, 4, 8], "given": [0, 4, 11], "constraint": [0, 4], "energi": [0, 3, 4, 5, 9, 10, 11], "latenc": [0, 3, 4, 5, 6, 9, 11], "cme": [0, 11], "acceler": [0, 4, 6, 8, 9, 10, 11, 13], "opt": 0, "dump_filename_pattern": [0, 4], "output": [0, 4, 5, 6, 11, 12, 13], "datetim": [0, 11], "json": [0, 9, 11], "pickle_filenam": 0, "list_of_cm": 0, "pickl": [0, 11], "The": [0, 1, 2, 4, 5, 6, 8, 9, 12, 13], "input": [0, 3, 4, 5, 8, 9, 13], "ar": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13], "A": [0, 5, 6, 8, 10, 13], "neural": [0, 5, 10], "network": [0, 4, 5, 10], "defin": [0, 4, 5, 9, 10, 11, 13], "onnx": [0, 3, 4, 8, 11], "format": [0, 1, 2, 9], "own": [0, 11, 13], "high": [0, 5, 10], "level": [0, 5, 11], "hw": [0, 3, 4, 6, 8, 11], "descript": [0, 8, 11], "specifi": [0, 5, 9], "core": [0, 4, 6, 8, 11, 13], "alloc": [0, 5, 8, 10, 11], "spatial": [0, 3, 5, 8, 9, 10, 13], "option": [0, 5], "tempor": [0, 3, 4, 6, 9], "order": [0, 2, 3, 5, 10, 11], "memori": [0, 3, 6, 8, 9, 10, 11, 13], "operand": [0, 5, 8, 13], "link": [0, 1, 5, 8, 13], "optim": [0, 4, 6, 10], "target": 0, "It": [0, 4, 9, 11, 13], "edp": [0, 11], "delai": 0, "product": 0, "name": [0, 4, 5, 8, 13], "result": [0, 6, 9], "which": [0, 4, 5, 8, 9, 11, 13], "includ": [0, 2, 3, 5, 9], "all": [0, 2, 4, 5, 9, 11, 13], "detail": [0, 2, 6, 7, 11], "metadata": 0, "analys": 0, "debug": 0, "number": [0, 5, 9], "indic": [0, 13], "overal": 0, "consum": 0, "run": [0, 2, 6, 7, 8, 11], "user": [0, 3, 4, 5, 6, 7, 11], "wai": [0, 1, 2, 4, 5, 9, 11, 13], "cycl": [0, 5], "count": 0, "collect": 0, "cost": [0, 3, 4, 5, 6, 13], "evalu": [0, 5, 11], "stand": 0, "we": [0, 2, 3, 4, 5, 11], "demonstr": 0, "how": [0, 2, 4, 5, 7, 8, 9, 11], "us": [0, 1, 2, 3, 4, 5, 7, 8, 9, 11, 13], "multipl": [0, 5, 6, 10, 11, 13], "demo": 0, "comment": [1, 2], "within": [1, 5, 8, 11, 13], "sourc": [1, 2], "zigzag": [1, 4, 5, 8, 9, 11, 12, 13], "framework": [1, 2, 4, 6, 7, 8, 10, 11, 12, 13], "support": [1, 3, 4, 5, 6, 11], "auto": [1, 10], "doxygen": 1, "automat": [1, 4, 5, 6, 8, 11, 13], "updat": [1, 2, 3, 11], "soon": 1, "somebodi": 1, "push": 1, "someth": 1, "master": 1, "branch": 1, "github": [1, 7, 10], "repo": [1, 13], "project": [1, 6, 10], "follow": [1, 2, 4, 5, 8, 9, 11, 12, 13], "access": [1, 3, 5], "latest": 1, "version": [1, 6, 11], "when": [2, 8, 11, 13], "pleas": [2, 9, 11], "consid": 2, "googl": 2, "style": 2, "guid": [2, 3, 6], "docstr": 2, "class": [2, 3, 11], "method": [2, 5, 9], "exampl": [2, 4, 8, 9, 11, 13], "found": [2, 11, 13], "throughout": 2, "here": [2, 3, 4, 8, 10, 13], "accordingli": 2, "In": [2, 4, 5, 6, 9, 11, 13], "packag": [2, 6], "call": [2, 5], "bumpver": 2, "twine": 2, "These": [2, 11], "instal": [2, 6], "pip": [2, 7], "first": [2, 5, 6, 11], "pull": 2, "make": [2, 3, 5, 7, 9], "sure": 2, "have": [2, 4, 5, 11, 13], "remot": 2, "cahng": 2, "merg": 2, "conflict": 2, "chang": [2, 5, 6, 11], "commit": 2, "Then": [2, 13], "command": [2, 4, 13], "patch": 2, "m": [2, 5, 10], "upload": 2, "dist": 2, "zigzag_ds": 2, "x": [2, 5], "y": [2, 5], "z": [2, 5], "whl": 2, "dse": [2, 6, 7], "tar": 2, "gz": 2, "provid": [2, 4, 5, 6, 7, 8, 11, 12, 13], "sever": 2, "differ": [2, 4, 5, 6, 9, 11, 13], "There": [2, 5, 9], "mani": [2, 5], "public": [2, 6], "relat": 2, "page": [2, 6], "allow": [2, 5, 8], "everyon": 2, "get": [2, 6, 7], "familiar": 2, "more": [2, 3, 4, 5, 7, 11, 12, 13], "about": [2, 9, 11], "implement": 2, "ad": [2, 5, 8], "mandatori": 2, "what": [2, 5, 8, 9, 11], "doe": 2, "achiev": [2, 5], "newli": 2, "explicit": 2, "resid": [2, 11], "doc": 2, "folder": [2, 11], "restructuredtext": 2, "rst": 2, "decid": 2, "would": [2, 13], "best": [2, 11], "fit": 2, "exist": [2, 11], "one": [2, 4, 5, 11], "If": [2, 7, 9, 11, 13], "creat": [2, 8], "lower": [2, 5], "case": [2, 3, 6, 13], "letter": [2, 13], "hyphen": 2, "between": [2, 4, 6, 13], "word": [2, 5], "after": [2, 5, 7, 11], "need": [2, 4, 5, 8, 13], "add": [2, 3, 5, 7, 13], "toctre": 2, "index": [2, 6], "same": [2, 3, 5], "webpag": 2, "sphinx": 2, "should": [2, 5, 8, 9, 13], "both": [2, 3], "press": 2, "theme": 2, "easi": [2, 9], "through": [2, 4, 5, 6, 7, 8, 10, 11, 13], "requir": [2, 4, 5, 7, 8, 9, 11, 13], "txt": [2, 7], "cd": 2, "r": [2, 5, 7], "simpli": [2, 11], "b": [2, 5, 13], "html": 2, "entri": [2, 8], "point": [2, 6], "guidlin": 2, "paramet": [2, 5, 11], "constructor": 2, "download": 2, "describ": [2, 5, 13], "successfulli": 2, "configur": [2, 10], "done": 2, "either": [2, 5], "gui": 2, "conf": 2, "find": [3, 4, 6, 11], "plan": 3, "oper": [3, 8, 11], "ancestor": 3, "layernod": [3, 13], "dummynod": [3, 13], "fix": 3, "loop": [3, 10, 11, 13], "multi": [3, 6], "dimension": 3, "unrol": [3, 5], "fraction": 3, "account": [3, 11, 13], "bandwidth": [3, 5], "loma": [3, 4, 10, 11], "memoryalloc": 3, "besid": [3, 4, 5, 11], "capac": [3, 5], "lpf": 3, "limit": [3, 10], "visualis": 3, "tutori": 3, "remak": 3, "tabl": [3, 5], "without": 3, "df": [3, 5], "stage": [3, 4, 6, 9, 12], "stack": 3, "combin": [3, 5, 8, 9, 11], "common": 3, "versatil": 4, "tool": 4, "estim": [4, 6], "dl": [4, 6], "design": [4, 5, 6, 11], "multitud": 4, "set": [4, 11], "As": [4, 11], "step": [4, 11], "nn": [4, 5, 13], "onto": [4, 6, 8], "go": 4, "alexnet": 4, "ha": [4, 5, 11, 12, 13], "been": 4, "shape": 4, "infer": [4, 5], "mean": 4, "tensor": [4, 5, 13], "intermedi": [4, 5, 13], "inform": [4, 5, 8, 9, 11, 12, 13], "know": [4, 5, 8, 9, 13], "correctli": [4, 5, 13], "tpu": [4, 5], "like": [4, 11, 13], "tpu_lik": 4, "py": [4, 8, 11, 13], "must": [4, 11], "suggest": 4, "resourc": [4, 6, 8], "alexnet_on_tpu_lik": 4, "gener": [4, 5, 6, 8, 9, 11, 12], "ran": 4, "main": [4, 5, 7, 9, 13], "pars": [4, 11, 13], "contain": [4, 8, 13], "program": 4, "flow": [4, 11], "document": [4, 7, 11, 12], "main_onnx": [4, 13], "note": [4, 9], "construct": [4, 5], "becaus": 4, "object": [4, 5, 9, 11, 13], "respect": [4, 5, 9], "modul": [4, 6], "other": [4, 5, 11, 13], "also": [4, 5, 7, 8, 9, 11, 13], "see": [4, 9, 13], "section": [4, 5, 9, 11], "manual": [4, 5, 6, 8, 11], "definit": [4, 8, 9, 11], "resnet18": [4, 8, 13], "salsa": [4, 11], "search": [4, 6], "engin": [4, 6, 11], "util": [4, 9], "schedul": [4, 5, 6, 11], "than": 4, "main_onnx_salsa": 4, "dure": 4, "save": [4, 9], "depend": [4, 7, 13], "total": [4, 11], "five": [4, 12], "each": [4, 5, 9, 11, 13], "node": [4, 8, 9, 11], "onnxmodelparserstag": [4, 8, 11, 13], "wa": 4, "minimallatencystag": [4, 11], "refer": [4, 13], "introduc": 5, "concept": [5, 11], "well": 5, "known": 5, "start": [5, 6, 7, 11], "smallest": 5, "build": [5, 12, 13], "block": [5, 12], "work": [5, 9], "our": [5, 11], "up": [5, 11], "toward": [5, 10], "summat": 5, "accumul": 5, "across": [5, 10, 11], "data": [5, 9], "activ": 5, "train": 5, "weight": [5, 13], "typic": [5, 8], "multipli": 5, "two": [5, 9], "element": [5, 11], "attribut": [5, 9, 13], "input_precis": 5, "list": [5, 11, 13], "precis": [5, 13], "bit": [5, 13], "output_precis": 5, "energy_cost": 5, "singl": [5, 11], "e": [5, 8, 10, 11, 13], "g": [5, 8, 11], "area": [5, 10], "overhead": 5, "inferenc": 5, "million": 5, "parallel": [5, 8, 13], "significantli": 5, "speed": 5, "comput": [5, 6, 8, 10, 13], "increas": 5, "effici": 5, "cover": 5, "later": [5, 11], "dimens": [5, 11, 13], "size": [5, 13], "explain": [5, 9, 11], "introduct": 5, "operational_unit": 5, "built": 5, "dict": 5, "kei": [5, 8], "being": [5, 11], "identifi": 5, "d1": 5, "d2": 5, "valu": [5, 11, 13], "along": 5, "store": 5, "attach": 5, "hierarch": 5, "fashion": 5, "big": 5, "term": 5, "write": [5, 8], "read": [5, 13], "its": [5, 7, 9, 11], "port": 5, "r_bw": 5, "w_bw": 5, "per": 5, "r_cost": 5, "w_cost": 5, "r_port": 5, "w_port": 5, "rw_port": 5, "address": 5, "receiv": [5, 11], "correspond": [5, 11], "For": [5, 11, 13], "now": 5, "assum": [5, 13], "1": [5, 10], "prefetch": 5, "behavior": 5, "thank": 5, "determinist": 5, "dataflow": [5, 10], "min_r_granular": 5, "min_w_granular": 5, "minim": [5, 11], "granular": 5, "better": 5, "half": 5, "quarter": 5, "pattern": [5, 11], "wordlength": 5, "256": 5, "100": 5, "128": 5, "approximatlli": 5, "onli": [5, 9, 11, 13], "50": 5, "while": [5, 11], "spec": [5, 7], "encod": [5, 8], "interconnect": [5, 11], "add_memori": 5, "where": [5, 11, 13], "connect": [5, 11], "To": [5, 11], "anoth": [5, 11], "decoupl": 5, "algorithm": [5, 6, 8, 10, 13], "side": [5, 13], "oppos": 5, "typical": 5, "o": [5, 8, 13], "w": [5, 8, 10], "think": [5, 11], "virtual": [5, 13], "actual": [5, 13], "memory_operand_link": [5, 8, 13], "similarli": 5, "form": 5, "accompani": 5, "served_dimens": 5, "serv": [5, 11], "hot": 5, "tupl": [5, 11], "lastli": 5, "assign": 5, "movev": 5, "possibl": [5, 13], "four": 5, "type": [5, 12, 13], "movement": 5, "fh": 5, "th": 5, "low": 5, "fl": 5, "tl": 5, "At": 5, "time": [5, 8], "syntax": 5, "port_typ": 5, "_port_": 5, "port_numb": 5, "rw": 5, "equal": 5, "altern": [5, 7, 13], "default": [5, 8], "probid": 5, "intern": [5, 7, 10, 11], "memoryhierarchi": 5, "extend": 5, "networkx": 5, "digraph": 5, "so": [5, 11, 13], "operational_arrai": 5, "new": [5, 6, 11], "memorylevel": 5, "graph": [5, 11, 13], "memory_inst": 5, "memoryinst": 5, "port_alloc": 5, "direction": 5, "abov": 5, "togeth": [5, 13], "id": [5, 8, 13], "memory_hierarchi": 5, "core_set": 5, "compris": 5, "global_buff": 5, "share": 5, "current": [5, 9], "un": 5, "repositori": [5, 7], "5": 5, "dnn": [5, 10], "meta": 5, "prototyp": 5, "2": 5, "edg": [5, 13], "3": [5, 7], "ascend": 5, "4": [5, 10], "tesla": 5, "npu": 5, "depth": [5, 6], "research": 5, "fair": 5, "relev": [5, 9], "comparison": 5, "normal": 5, "them": [5, 11], "1024": [5, 13], "mac": 5, "maxim": 5, "2mb": 5, "global": 5, "buffer": 5, "gb": 5, "kept": 5, "local": 5, "shown": 5, "idx": 5, "7": 5, "9": 5, "variant": 5, "everi": [5, 8], "chip": 5, "denot": 5, "end": [5, 7, 11], "6": [5, 10, 11], "8": [5, 7, 10], "10": [5, 10], "k": [5, 10, 13], "channel": [5, 13], "c": [5, 13], "ox": [5, 13], "oi": [5, 13], "featur": 5, "fx": [5, 13], "fy": [5, 13], "h": [5, 10], "sumbul": [5, 10], "t": [5, 8, 10, 13], "f": 5, "wu": [5, 10], "li": 5, "sarwar": 5, "koven": 5, "murphi": 5, "trotzki": 5, "cai": 5, "ansari": 5, "d": [5, 10], "morri": 5, "liu": [5, 10], "kim": 5, "beign": [5, 10], "lab": 5, "system": [5, 10, 11], "integr": [5, 10], "vr": 5, "custom": [5, 7, 8, 13], "power": 5, "7nm": 5, "technologi": 5, "codec": 5, "avatar": 5, "2022": [5, 10], "ieee": [5, 10], "circuit": [5, 10], "confer": [5, 10], "cicc": 5, "pp": [5, 10], "01": 5, "08": 5, "n": [5, 10], "p": [5, 10], "jouppi": 5, "young": 5, "patil": 5, "patterson": 5, "agraw": 5, "bajwa": 5, "bate": 5, "bhatia": 5, "boden": 5, "borcher": 5, "boyl": 5, "l": [5, 10], "cantin": 5, "chao": 5, "clark": 5, "j": 5, "coriel": 5, "dalei": 5, "dau": 5, "dean": 5, "gelb": 5, "v": [5, 10], "ghaemmaghami": 5, "gottipati": 5, "gulland": 5, "hagmann": 5, "ho": 5, "hogberg": 5, "hu": 5, "hundt": 5, "hurt": 5, "ibarz": 5, "jaffei": 5, "jaworski": 5, "kaplan": 5, "khaitan": 5, "killebrew": 5, "koch": 5, "kumar": 5, "laci": 5, "laudon": 5, "law": 5, "le": 5, "leari": 5, "luck": 5, "lundin": 5, "mackean": 5, "maggior": 5, "mahoni": 5, "miller": 5, "nagarajan": 5, "narayanaswami": 5, "ni": 5, "nix": 5, "norri": 5, "omernick": 5, "penukonda": 5, "phelp": 5, "ross": 5, "salek": 5, "samadiani": 5, "severn": 5, "sizikov": 5, "snelham": 5, "souter": 5, "steinberg": 5, "swing": 5, "tan": 5, "thorson": 5, "tian": 5, "toma": 5, "tuttl": 5, "vasudevan": 5, "walter": 5, "wang": 5, "wilcox": 5, "yoon": 5, "datacent": 5, "analysi": 5, "process": [5, 11], "sigarch": 5, "archit": 5, "vol": [5, 10], "45": 5, "12": 5, "jun": 5, "2017": 5, "yazdanbakhsh": 5, "seshadri": 5, "akin": 5, "convolut": [5, 8, 13], "arxiv": [5, 10], "print": [5, 10], "2102": 5, "10423": 5, "feb": 5, "2021": [5, 10], "liao": 5, "tu": 5, "xia": 5, "zhou": 5, "yuan": 5, "scalabl": 5, "unifi": 5, "ubiquit": 5, "deep": [5, 6, 10], "industri": 5, "track": 5, "paper": [5, 10, 13], "symposium": [5, 10], "hpca": [5, 10], "789": 5, "801": 5, "talp": 5, "sarma": 5, "venkataramanan": 5, "bannon": 5, "mcgee": 5, "floer": 5, "jalot": 5, "hsiong": 5, "arora": 5, "gorti": 5, "sachdev": 5, "solut": 5, "full": 5, "self": [5, 9], "drive": 5, "micro": 5, "40": 5, "25": 5, "35": 5, "2020": [5, 10], "space": [6, 11], "explor": [6, 11], "learn": 6, "bridg": 6, "gap": 6, "decis": 6, "special": 6, "fast": [6, 10], "accur": 6, "analyt": [6, 10], "crucial": 6, "part": [6, 8], "clone": 6, "analyz": [6, 10], "api": [6, 7], "get_hardware_performance_zigzag": 6, "futur": 6, "contribut": [6, 13], "guidelin": [6, 13], "upgrad": 6, "develop": 6, "idea": 6, "explan": 6, "studi": 6, "extens": 6, "cross": 6, "fuse": 6, "code": 6, "re": 7, "interest": [7, 11], "modif": [7, 9], "directli": 7, "venv": 7, "conda": 7, "environ": 7, "look": [7, 11], "want": [7, 8, 11, 13], "git": 7, "com": 7, "kuleuven": 7, "mica": 7, "http": 7, "anaconda": 7, "argument": [7, 11], "autom": [8, 10], "some": [8, 11, 13], "aspect": [8, 9, 11], "interfac": 8, "core_alloc": [8, 13], "spatial_map": [8, 9, 13], "strategi": [8, 13], "spatialmappinggeneratorstag": [8, 11, 13], "hierarchi": [8, 9, 11], "extra": [8, 11], "flexibl": 8, "scheme": 8, "don": 8, "put": 8, "safe": 8, "bet": 8, "copi": [8, 11], "exact": 8, "detect": 8, "dictionari": [8, 13], "interpret": 9, "predefin": 9, "costmodelevalu": [9, 11], "knowledg": 9, "irrelev": 9, "handl": 9, "complexhandl": 9, "insid": [9, 11, 13], "represent": [9, 11], "invok": 9, "pass": 9, "__simplejsonrepr__": 9, "convert": [9, 11, 13], "off": [9, 10], "load": [9, 13], "reli": 9, "def": 9, "simpl": [9, 11], "energy_tot": 9, "latency_total2": 9, "standard": 9, "filename_pattern": [9, 11], "lose": 9, "etc": [9, 11], "concern": 9, "__jsonrepr__": 9, "temporal_map": 9, "mem_utili_shar": 9, "word_access": 9, "memory_word_access": 9, "operational_energi": 9, "mac_energi": 9, "memory_energi": 9, "mem_energi": 9, "energy_breakdown_per_level": 9, "energy_breakdown": 9, "energy_breakdown_per_level_per_operand": 9, "energy_breakdown_furth": 9, "latency_without_onloading_without_offload": 9, "latency_total0": 9, "latency_with_onloading_without_offload": 9, "latency_total1": 9, "latency_with_onloading_with_offload": 9, "goal": [9, 11], "straightforward": 9, "care": 9, "certain": 9, "modifi": [9, 11], "parser": 9, "pointer": 10, "mei": 10, "houshmand": 10, "jain": 10, "giraldo": 10, "verhelst": 10, "enlarg": 10, "joint": 10, "transact": 10, "70": 10, "1160": 10, "1174": 10, "aug": 10, "doi": 10, "1109": 10, "tc": 10, "3059962": 10, "uniform": 10, "divers": 10, "test": 10, "europ": 10, "exhibit": 10, "date": 10, "antwerp": 10, "belgium": 10, "220": 10, "225": 10, "23919": 10, "date54114": 10, "9774728": 10, "slide": 10, "video": 10, "symon": 10, "base": [10, 11], "3rd": 10, "artifici": 10, "intellig": 10, "aica": 10, "washington": 10, "dc": 10, "usa": 10, "aicas51828": 10, "9458493": 10, "coseman": 10, "papista": 10, "bhattacharje": 10, "deback": 10, "mallik": 10, "verkest": 10, "opportun": 10, "emerg": 10, "analog": 10, "electron": 10, "devic": 10, "meet": 10, "iedm": 10, "san": 10, "francisco": 10, "ca": 10, "29": 10, "iedm13553": 10, "9372006": 10, "accuraci": 10, "trade": 10, "contemporari": 10, "9458553": 10, "colleman": 10, "verelst": 10, "tuytelaar": 10, "processor": 10, "dynam": 10, "ifip": 10, "29th": 10, "veri": 10, "larg": [10, 13], "scale": 10, "vlsi": 10, "soc": 10, "singapor": 10, "soc53125": 10, "9607013": 10, "zhu": 10, "sun": 10, "mobil": 10, "transform": 10, "4th": 10, "incheon": 10, "korea": 10, "republ": 10, "142": 10, "145": 10, "aicas54282": 10, "9869945": 10, "goetschalckx": 10, "enabl": 10, "2023": 10, "karl": 10, "heterogen": 10, "exploit": 10, "fine": 10, "grain": 10, "48550": 10, "2212": 10, "10612": 10, "fasfou": 10, "genet": 10, "date56975": 10, "10137070": 10, "modularli": 11, "easili": 11, "adapt": 11, "sequenc": 11, "determin": 11, "mainstag": 11, "initi": 11, "acceleratorparserstag": 11, "simplesavestag": 11, "workloadstag": 11, "sm": 11, "lomastag": 11, "tm": 11, "costmodelstag": 11, "accelerator_path": 11, "arg": 11, "onnx_model_path": 11, "mapping_path": 11, "loma_lpf_limit": 11, "loma_show_progress_bar": 11, "true": [11, 13], "show": 11, "progress": 11, "bar": 11, "over": 11, "similar": 11, "those": 11, "pipelin": [11, 13], "remain": 11, "said": 11, "further": 11, "label": 11, "below": 11, "fed": 11, "far": 11, "discuss": 11, "last": 11, "revers": 11, "hold": 11, "finish": 11, "conbim": 11, "yield": 11, "chain": 11, "manipul": 11, "invoc": 11, "lowest": 11, "still": 11, "miss": 11, "__init__": 11, "workloadparserstag": 11, "workload_path": 11, "generalparameteriteratorstag": 11, "whose": 11, "predetermin": 11, "plottemporalmappingsstag": 11, "substag": 11, "keep": 11, "minimalenergystag": 11, "list_of_cal": 11, "minimaledpstag": 11, "sumstag": 11, "sum": 11, "listifystag": 11, "instead": [11, 13], "removeextrainfostag": 11, "strip": 11, "info": 11, "subcal": 11, "cachebeforeyieldstag": 11, "cach": 11, "break": 11, "top": 11, "bottom": 11, "skipifdumpexistsstag": 11, "check": 11, "alreadi": 11, "skip": 11, "multiprocessingspawnstag": 11, "multiprocess": 11, "multiprocessinggatherstag": 11, "completesavestag": 11, "picklesavestag": 11, "dumpstag": 11, "salsastag": 11, "simul": 11, "anneal": 11, "temporalorderingconversionstag": 11, "spatialmappingconversionstag": 11, "auser": 11, "arrai": 11, "present": [11, 13], "inner": 11, "most": 11, "config": 11, "let": 11, "sai": 11, "metric": 11, "easiest": 11, "accord": 11, "intend": 11, "behaviour": 11, "guarante": 11, "correct": 11, "taken": 11, "inherit": 11, "abstract": 11, "callabl": 11, "kwarg": 11, "second": 11, "extra_info": 11, "reduct": 11, "statement": 11, "outsid": 11, "happen": 11, "regard": 12, "major": 12, "compon": 12, "recommend": 13, "context": 13, "ml": 13, "often": 13, "recogn": 13, "complet": 13, "conv": 13, "qlinearconv": 13, "matmul": 13, "gemm": 13, "accelerat": 13, "incur": 13, "zero": 13, "feel": 13, "free": 13, "open": 13, "issu": 13, "yourself": 13, "rather": 13, "avoid": 13, "origin": 13, "discard": 13, "doesn": 13, "do": 13, "onnx_model": 13, "modelproto": 13, "my_model_with_internal_data": 13, "save_model": 13, "save_as_external_data": 13, "all_tensors_to_one_fil": 13, "locat": 13, "external_data_filenam": 13, "size_threshold": 13, "convert_attribut": 13, "fals": 13, "raw": 13, "specif": 13, "directori": 13, "shape_infer": 13, "my_model": 13, "inferred_model": 13, "infer_shap": 13, "my_inferred_model": 13, "moreov": 13, "repres": 13, "equat": 13, "small": 13, "wherea": 13, "alwai": 13, "freeli": 13, "dimension_rel": 13, "relationship": 13, "stride": 13, "filter": 13, "dilat": 13, "rate": 13, "loop_dim_s": 13, "left": 13, "hand": 13, "operand_precis": 13, "partial": 13, "o_fin": 13, "final": 13, "operand_sourc": 13, "come": 13, "constant_operand": 13, "constant": 13, "prior": 13, "none": 13, "readm": 13, "notat": 13, "batch": 13, "row": 13, "column": 13, "kernel": 13}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"zigzag": [0, 2, 6, 7, 10], "api": 0, "get_hardware_performance_zigzag": 0, "code": [1, 2], "document": [1, 2, 3, 6], "contribut": 2, "guidelin": 2, "upgrad": 2, "project": 2, "version": 2, "develop": 2, "write": 2, "new": [2, 10], "part": 2, "gener": [2, 10], "build": 2, "local": 2, "which": 2, "support": [2, 10, 13], "doxygen": 2, "futur": 3, "chang": 3, "framework": 3, "get": 4, "start": 4, "first": [4, 10], "run": 4, "analyz": 4, "result": [4, 11], "hardwar": 5, "architectur": 5, "oper": [5, 13], "unit": 5, "arrai": 5, "memori": 5, "instanc": 5, "hierarchi": 5, "core": [5, 10], "hw": 5, "acceler": 5, "model": [5, 10, 11, 13], "exampl": 5, "specif": 5, "set": 5, "refer": 5, "welcom": 6, "": [6, 13], "content": 6, "indic": 6, "tabl": 6, "instal": 7, "packag": 7, "manual": [7, 13], "clone": 7, "prerequisit": 7, "map": [8, 10, 11], "user": [8, 12], "defin": 8, "constraint": 8, "output": 9, "simplesavestag": 9, "completesavestag": 9, "creat": [9, 11], "custom": [9, 11], "savestag": 9, "public": 10, "The": [10, 11], "idea": 10, "detail": 10, "latenc": 10, "explan": 10, "tempor": [10, 11], "search": 10, "engin": 10, "differ": 10, "design": 10, "space": 10, "explor": 10, "case": 10, "studi": 10, "extens": 10, "cross": 10, "layer": [10, 13], "depth": 10, "schedul": 10, "multi": 10, "fuse": 10, "stage": 11, "introduct": 11, "main": 11, "entri": 11, "point": 11, "sequenti": 11, "call": 11, "back": 11, "pass": 11, "implement": 11, "input": 11, "parser": 11, "iter": 11, "plot": 11, "reduc": 11, "optim": 11, "save": [11, 13], "dump": 11, "spatial": 11, "cost": 11, "your": [11, 13], "guid": 12, "workload": 13, "onnx": 13, "extern": 13, "data": 13, "infer": 13, "an": 13, "shape": 13, "definit": 13}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 58}, "alltitles": {"ZigZag API": [[0, "zigzag-api"]], "get_hardware_performance_zigzag()": [[0, "get-hardware-performance-zigzag"]], "Code Documentation": [[1, "code-documentation"]], "Contribute": [[2, "contribute"]], "Contributing guidelines": [[2, "contributing-guidelines"]], "Upgrading the project version (for ZigZag developers)": [[2, "upgrading-the-project-version-for-zigzag-developers"]], "Documentation": [[2, "documentation"], [3, "documentation"]], "Writing new parts for the general documentation": [[2, "writing-new-parts-for-the-general-documentation"]], "Building the general documentation locally": [[2, "building-the-general-documentation-locally"]], "Writing code which supports the code documentation with Doxygen": [[2, "writing-code-which-supports-the-code-documentation-with-doxygen"]], "Building the code documentation locally": [[2, "building-the-code-documentation-locally"]], "Future changes": [[3, "future-changes"]], "Framework": [[3, "framework"]], "Getting Started": [[4, "getting-started"]], "First run": [[4, "first-run"]], "Analyzing results": [[4, "analyzing-results"]], "Hardware Architecture": [[5, "hardware-architecture"]], "Operational Unit": [[5, "operational-unit"]], "Operational Array": [[5, "operational-array"]], "Memory Instance": [[5, "memory-instance"]], "Memory Hierarchy": [[5, "memory-hierarchy"]], "Core": [[5, "core"]], "HW Accelerator Model": [[5, "hw-accelerator-model"]], "Modelled examples": [[5, "modelled-examples"]], "Specific settings": [[5, "specific-settings"]], "References": [[5, "references"]], "Welcome to ZigZag\u2019s documentation!": [[6, "welcome-to-zigzag-s-documentation"]], "Contents:": [[6, null]], "Indices and tables": [[6, "indices-and-tables"]], "Installing ZigZag": [[7, "installing-zigzag"]], "Installing as a package": [[7, "installing-as-a-package"]], "Manual clone": [[7, "manual-clone"]], "Prerequisites": [[7, "prerequisites"]], "Installation": [[7, "installation"]], "Mapping": [[8, "mapping"]], "User-defined mapping constraints": [[8, "user-defined-mapping-constraints"]], "Outputs": [[9, "outputs"]], "SimpleSaveStage": [[9, "simplesavestage"]], "CompleteSaveStage": [[9, "completesavestage"]], "Creating a custom SaveStage": [[9, "creating-a-custom-savestage"]], "Publications": [[10, "publications"]], "The general idea of ZigZag": [[10, "the-general-idea-of-zigzag"]], "Detailed latency model explanation": [[10, "detailed-latency-model-explanation"]], "The new temporal mapping search engine": [[10, "the-new-temporal-mapping-search-engine"]], "Different design space exploration case studies": [[10, "different-design-space-exploration-case-studies"]], "Extension to support cross-layer depth-first scheduling": [[10, "extension-to-support-cross-layer-depth-first-scheduling"]], "Extension to support multi-core layer-fused scheduling": [[10, "extension-to-support-multi-core-layer-fused-scheduling"]], "Stages": [[11, "stages"]], "Introduction": [[11, "introduction"]], "The main entry point": [[11, "the-main-entry-point"]], "The sequential call of stages": [[11, "the-sequential-call-of-stages"]], "The back passing of results": [[11, "the-back-passing-of-results"]], "Implemented stages": [[11, "implemented-stages"]], "Input parser stages": [[11, "input-parser-stages"]], "Iterator stage": [[11, "iterator-stage"]], "Plot stages": [[11, "plot-stages"]], "Reduce stages": [[11, "reduce-stages"]], "Optimization stages": [[11, "optimization-stages"]], "Save and dump stages": [[11, "save-and-dump-stages"]], "Temporal mapping stages": [[11, "temporal-mapping-stages"]], "Spatial mapping stages": [[11, "spatial-mapping-stages"]], "Cost model stages": [[11, "cost-model-stages"]], "Creating your custom stage": [[11, "creating-your-custom-stage"]], "User Guide": [[12, "user-guide"]], "Workload": [[13, "workload"]], "Onnx models": [[13, "onnx-models"]], "Supported onnx operators": [[13, "supported-onnx-operators"]], "Saving your onnx model with external data": [[13, "saving-your-onnx-model-with-external-data"]], "Inferring an onnx model\u2019s shapes": [[13, "inferring-an-onnx-model-s-shapes"]], "Manual layer definition": [[13, "manual-layer-definition"]]}, "indexentries": {}}) \ No newline at end of file