README.md
Source code
# Applications
This subdirectory contains some applications or benchmarks specifically implemented and optimized for Snitch.
## Contents
- Data generation:
- `data_gen.py`: script to generate data and expected results for various benchmarks
- `data`: output folder of `data_gen.py` which also contains the configuration to generate the data
- `src`:
- `kernels`: basic kernels, currently contains `GEMM`, `BatchNorm`, `Maxpool`, `Fusedconv`
- `layers`: wraps the kernel to form a DNN layer. Manages data-movement, synchronization, double buffering etc.
- `utils`: some helpful functions for benchmarking, verification, fast `memset`
- `net_layer.c`: various ready tests to run layers.
- `include`: includes `layer` struct.
## SW Testbenches
There are currently a few tests for various layer types. Some additional information about these tests is given below:
- `net_maxpool.c`: Naive implementation of a maxpooling layer, not optimized in any way due to memory-boundness
- `net-batchnorm.c`: Implementation of a batchnorm layer with SSR streams (both read and write)
- `net-conv2d.c`: Implementation and tiling of a 2D convolution that can be distributed to multiple clusters. The convolution is implemented as an `im2col` transformation (performed by 2D DMA transfers) + optimized GEMM. The memory layout of input and output feature map is Height x Width x Channels. The convolution is globally parallelized over output channels. Inside a cluster, the output pixels are distributed among the cores. There is an option to load the feature map from a different cluster instead of the main memory by setting `cluster2cluster` in the layer struct to `1`. Currently only `fp64` is implemented, but the data movement for `fp32` or lower precision SIMD should be analogously.
- `net-gemm.c`: Testbench to benchmark the optimized GEMM implementation for different memory layouts, dimensions and precisions.
- `net-fusedconv.c`: Implementation of a fused kernel with Conv2d + BatchNorm + ReLU. The interface of the kernel is compatible with DORY. Parameters of a tile can be specified in `data/fusedconv_param.hjson`. Supported paramters are input/output dimension, padding, kernel dimension & stride, flags for BatchNorm and ReLU. Further there are two additional specialized kernels 1) a CHW kernel for input layers with very few input channels, the output of this kernel is in the HWC layout again 2) A depthwise kernel
## Usage
To run a specific benchmark, first configure the dimensions and the desired precision `data/app_params.hjson`.
The file will be automatically generated with a `cmake` macro and is stored in `data/data_app.h`. The result will also be checked. Reference is a golden model written in `python` with help of the `torch`.
The applications are compiled into a folder which can be enabled by adding `add_subdirectory(${SNITCH_SOFTWARE_DIR}/applications` to `CMakeLists.txt` in the specific `sw` folder.
## Requirements
- `torch`
Updated on 2023-06-19 at 09:43:56 +0000