16 x 16 크기의 PE array와 max pooling unit을 통해 2-8b input/weight의 convolution, FC, element-wise operation이 가능하다. Convolution 연산에 대해 output-stationary dataflow를 가지고 있으며, activation FIFO를 통해 sliding window operation을 수행하여 data를 reuse한다. PE array는 row-wise로는 output channel별, column-wise로는 column별 연산을 수행한다.
Digital NN core와 AiMC core는 다른 spatial unrolling을 사용하므로, 다음 layer에 따라 output의 data ordering을 다르게한다. 만약 다음 layer가 digital NN core에서 수행된다면, horizontal-parallel(CHW)하게 수행되며, AiMC에서 수행될 경우에는 channel-parallel(HWC)하게 수행된다.
AiMC core는 1152 x 512 크기이며, 크기가 큰 convolution layer를 연산하는데 사용된다. Convolution 연산은 weight-stationary dataflow로 수행된다. Input은 signed-magnitude 방식의 7b이며, DAC를 통해 6b의 time pulse로 변환된다. Weight는 ternary로, 1개의 cell안에 2개의 SRAM를 가지고 있다.
AiMC core의 동작은 아래와 같은 3단계로 나뉜다.
위의 3단계는 pipelining되어서 AiMC는 항상 연산을 수행하도록 하여 AiMC의 temporal utilization을 극대화하였다.
Convolution 연산은 channel-wise로 수행되므로, 다음 연산을 위해서는 input feature map이 X방향으로 1칸 이동해야 한다. 이때 이전에 사용했던 input을 1칸 shift up한 후, activation buffer에 없는 input만 load함으로써 memory access를 줄인다. Data reuse를 통해 activation loading cycle이 약 48% 감소하였고, AiMC core의 연산 cycle 보다 loading cycle이 더 짧게 되어 AiMC core의 temporal utilization을 증가시킬 수 있다.
64-way SIMD module은 AiMC의 연산 결과에 element-wise operation을 수행하며, 64 channel output에 대해 parallel하게 연산한다. SIMD operation은 다음과 같이 6단계로 pipelining 되어있다.
기존에는 convolution을 수행한 결과에 대해 pooling을 수행하여 2단계로 연산이 수행되었는데, MCU에서 pooling pattern에 맞추어 input을 넣어주고, SIMD module에서 pooling을 수행함으로써 convolution + pooling을 한번에 수행할 수 있다.
AiMC는 kernel-order mapping을 사용한다. 위 그림과 같이 인 경우, 의 row와 의 column을 차지한다. AiMC가 1152 x 512 크기이므로, spatial utilization은 12.5% 밖에 되지 않는다.
위와 같이 column-wise로 만큼 parallel하게 연산하면 spatial utilization이 만큼 증가하며, 한번에 연산이 수행되는 output channel도 만큼 증가한다.
기존 pipeling은 한 layer의 연산이 끝나면 다음 layer의 연산을 수행하는 식으로 진행되었다. 이와는 다르게 이전 layer로 부터 연산하기에 충분한 activation이 모이면, 해당 activation에 대해 연산을 먼저 수행한다. 한 layer의 계산이 다 끝날 때 까지 기다리지 않기 때문에 activation을 memory에 저장했다가 다시 불러오지 않고, 연산에 사용하여 memory 사용량이 감소하며, 연산에 소요되는 시간 또한 감소한다.