KR20190063393A - 시스톨릭 어레이를 이용한 cnn 처리 장치 및 방법 - Google Patents
시스톨릭 어레이를 이용한 cnn 처리 장치 및 방법 Download PDFInfo
- Publication number
- KR20190063393A KR20190063393A KR1020180138456A KR20180138456A KR20190063393A KR 20190063393 A KR20190063393 A KR 20190063393A KR 1020180138456 A KR1020180138456 A KR 1020180138456A KR 20180138456 A KR20180138456 A KR 20180138456A KR 20190063393 A KR20190063393 A KR 20190063393A
- Authority
- KR
- South Korea
- Prior art keywords
- feature map
- input
- address
- pixel
- output
- Prior art date
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/06—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons
- G06N3/063—Physical realisation, i.e. hardware implementation of neural networks, neurons or parts of neurons using electronic means
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Health & Medical Sciences (AREA)
- Life Sciences & Earth Sciences (AREA)
- Biomedical Technology (AREA)
- Biophysics (AREA)
- General Health & Medical Sciences (AREA)
- Data Mining & Analysis (AREA)
- Evolutionary Computation (AREA)
- Computational Linguistics (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Artificial Intelligence (AREA)
- Neurology (AREA)
- Image Analysis (AREA)
Abstract
본 발명에서는 제1 레이어의 제1 웨이트 그룹을 저장하는 웨이트 메모리, 제1 웨이트 그룹을 적용할 입력 피쳐맵을 저장하는 피쳐맵 메모리, 제1 웨이트 그룹의 크기에 기반하여 입력 피쳐맵의 제1 입력 픽셀의 제1 위치로부터 이격된 제2 위치를 결정하고, 제2 위치에 인접하는 복수의 인접 픽셀을 결정하는 주소 발생기, 및 복수의 인접 픽셀에 제1 웨이트 그룹을 적용하여 제1 위치에 대응되는 제1 출력 픽셀을 획득하는 프로세서를 포함하는 CNN(Convolutional Neural Network) 처리 장치를 제공함으로써, 메모리 공간을 절약하여 메모리 공간을 효율적으로 활용할 수 있다.
Description
본 발명은 시스톨릭 어레이를 이용하여 컨볼루션 신경망(CNN, Convolutional Neural Network)을 처리하기 위한 장치 및 그 방법에 관한 것이다.
최근에는 영상 인식을 하는 경우 딥 러닝(deep learning) 방식의 네트워크의 일종인 컨볼루션 신경망(CNN, Convolutional Neural Network)을 주로 사용한다. 현재 컨볼루션 신경망을 처리하는 여러 단계 중에서 연산시간이 가장 많이 드는 컨볼루션 연산 과정을 컨볼루션 전용 하드웨어를 사용하여 가속화하는 연구 및 개발이 많이 진행되고 있다.
컨볼루션 신경망에서는 여러 개의 컨볼루션 레이어와 풀링 레이어를 사용하여, 최종적으로 입력 이미지 내의 물체의 위치 또는 물체의 종류를 알아내기 위한 정보를 추출할 수 있다. 이 경우, 컨볼루션 레이어 또는 풀링 레이어 각각은 N장의 입력 피쳐맵(input feature map)(입력 이미지)을 사용하여 M장의 출력 피쳐맵(output feature map)을 생성할 수 있다.
시스톨릭 어레이(SA, Systolic Array)는 동일한 동작을 하는 많은 PE(Processing Element)들로 이루어져 있으며, 각 PE에 입력 데이터를 입력함으로써 동시에 많은 연산을 할 수 있다. 시스톨릭 어레이를 이용한 연산 기술은 오래 전부터 사용되던 방법이며, 최근에는 위의 컨볼루션 신경망과 같은 딥 신경망(Deep Neural Network)을 처리하기 위한 컨볼루션 과정에서도 사용되고 있다.
다만, 시스톨릭 어레이의 입력 피쳐맵을 패딩 영역을 추가한 상태로 시스톨릭 어레이의 행(row)별로 존재하는 온칩(on-chip) 메모리에 로딩하면서 출력 피쳐맵은 상기 온칩 메모리에 패딩 영역 없이 저장되는 경우, 패딩이 필요한 다음 레이어에서 이전 레이어의 출력을 입력으로서 이용할 수 없다. 또한, 이전 레이어의 출력 피쳐맵을 입력 피쳐맵으로써 이용하기 위해서는 DMA(Direct Memory Access)를 통해 외부 메모리에 저장했다가 다시 읽어 들여서 패딩 영역이 해당 번지에 설정되도록 정렬시켜야 하므로, 연산량이 많아진다는 단점이 있다. 또한, 패딩 영역을 위한 메모리 공간을 고려하여 출력 피쳐맵을 피쳐맵 메모리에 저장하고자 하는 경우, 하나의 PE 행의 계산 결과를 다음 PE행의 피쳐맵 메모리에 저장해야 하며, 패딩 공간으로 인해 피쳐맵 메모리의 공간을 낭비한다는 단점도 있다. 또한 피쳐맵 메모리에 입력 피쳐맵과 함께 계산된 결과인 출력 피쳐맵을 별도의 공간 나누어 저장해야 하므로, 메모리를 비효율적으로 사용하게 된다.
본 발명이 해결하고자 하는 과제는 시스톨릭 어레이를 이용함에 있어서 하나의 레이어에 대하여 연산한 결과를 다음 레이어에 대한 연산의 입력으로 쉽게 사용할 수 있고, 입력 피쳐맵과 출력 피쳐맵을 효율적으로 저장할 수 있는 컨볼루션 신경망 처리 장치 및 방법을 제공하는 것이다.
본 발명의 실시예에 따른 CNN(Convolutional Neural Network) 처리 장치는 제1 레이어의 제1 웨이트 그룹을 저장하는 웨이트 메모리; 상기 제1 웨이트 그룹을 적용할 입력 피쳐맵을 저장하는 피쳐맵 메모리; 상기 제1 웨이트 그룹의 크기에 기반하여 상기 입력 피쳐맵의 제1 입력 픽셀의 제1 위치로부터 이격된 제2 위치를 결정하고, 상기 제2 위치에 인접하는 복수의 인접 픽셀을 결정하는 주소 발생기; 및 상기 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 제1 위치에 대응되는 제1 출력 픽셀을 획득하는 프로세서를 포함할 수 있다.
상기 프로세서는 상기 제1 출력 피쳐맵에 상기 제1 레이어의 다음 레이어인 제2 레이어의 제2 웨이트 그룹을 적용하여 최종 출력 피쳐맵을 생성하고, 상기 주소 발생기는 외부 메모리로부터 상기 입력 피쳐맵을 로드하고, 상기 최종 출력 피쳐맵을 상기 외부 메모리로 전송할 수 있다.
상기 주소 발생기는 상기 입력 피쳐맵 및 상기 입력 피쳐맵에 포함된 복수의 입력 픽셀들의 주소 정보를 획득하고, 상기 복수의 입력 픽셀들의 주소 정보 중 상기 제1 위치의 주소 정보 및 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제2 위치를 결정하며, 상기 제2 위치를 상기 프로세서로 전송할 수 있다.
상기 주소 발생기는 상기 복수의 인접 픽셀의 주소 정보를 획득하고, 상기 복수의 인접 픽셀의 주소 정보 및 상기 복수의 입력 픽셀들의 주소 정보를 비교한 결과에 기반하여 상기 복수의 인접 픽셀 중 일부를 패딩(padding)으로 설정할 수 있다.
본 발명의 실시예에 따른 시스톨릭 어레이를 이용한 CNN(Convolutional Neural Network) 처리 방법은 복수의 채널로 구성된 입력 피쳐맵을 메모리의 주소 공간에 로딩하는 단계; N(N은 자연수)번째 채널의 M(M은 자연수)번째 입력 픽셀을 상기 주소 공간 중에서 N * (M-1)번째 주소에 로딩하는 단계; 및 N+1번째 채널의 M번째 입력 픽셀을 상기 주소 공간 중에서 (N+1) * (M-1)번째 주소에 로딩하는 단계를 포함할 수 있다.
상기 N번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 N * (M-1)번째 출력 픽셀을 획득하는 단계, 그리고 상기 N * (M-1)번째 출력 픽셀을 상기 N * (M-1)번째 주소에 저장하는 단계를 포함할 수 있다.
상기 N+1번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 (N+1) * (M-1)번째 출력 픽셀을 획득하는 단계, 그리고 상기 (N+1) * (M-1)번째 출력 픽셀을 상기 (N+1) * (M-1)번째 주소에 저장하는 단계를 포함할 수 있다.
상기 N번째 채널의 (M+1)번째 입력 픽셀을 상기 주소 공간 중에서 N * M번째 주소에 로딩하는 단계를 포함할 수 있다.
상기 N번째 채널의 (M+1)번째 입력 픽셀은 상기 N번째 채널의 M번째 입력 픽셀이 속한 컬럼의 다음 컬럼에 포함되는 픽셀일 수 있다.
상기 N번째 채널의 M+1번째 입력 픽셀에 웨이트를 적용하여 N * M번째 출력 픽셀을 획득하는 단계, 그리고 상기 N * M번째 출력 픽셀을 상기 M * M번째 주소에 저장하는 단계를 포함할 수 있다.
본 발명의 실시예에 따른 CNN 처리 장치는 피쳐맵 메모리; 제1 레이어의 제1 웨이트 그룹을 저장하는 웨이트 메모리; 복수의 입력 채널로 구성된 입력 피쳐맵에 상기 제1 웨이트 그룹을 적용하여 출력 피쳐맵을 생성하는 프로세서; 및 N번째 입력 채널의 M번째 입력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 N * (M-1)번째 주소에 로딩하며, (N+1)번째 입력 채널의 M번째 입력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 (N+1) * (M-1)번째 주소에 로딩하며, 상기 피쳐맵 메모리의 주소 공간 중 상기 입력 피쳐맵이 저장된 주소에 상기 출력 피쳐맵을 오버랩하여 저장하는 주소 발생기를 포함할 수 있다.
상기 프로세서는 상기 N번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 N * (M-1)번째 출력 픽셀을 획득하고, 상기 주소 발생기는 상기 N * (M-1)번째 출력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 상기 N * (M-1)번째 주소에 저장할 수 있다.
상기 프로세서는 상기 N+1번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 (N+1) * (M-1)번째 출력 픽셀을 획득하고, 상기 주소 발생기는 상기 (N+1) * (M-1)번째 출력 픽셀을 상기 (N+1) * (M-1)번째 주소에 저장할 수 있다.
상기 주소 발생기는 상기 N번째 채널의 (M+1)번째 입력 픽셀을 상기 주소 공간 중에서 N * M번째 주소에 로딩할 수 있다.
상기 N번째 채널의 (M+1)번째 입력 픽셀은 상기 N번째 채널의 M번째 입력 픽셀이 속한 컬럼의 다음 컬럼에 포함되는 픽셀일 수 있다.
상기 프로세서는 상기 N번째 채널의 M+1번째 입력 픽셀에 웨이트를 적용하여 N * M번째 출력 픽셀을 획득하고, 상기 주소 발생기는 상기 N * M번째 출력 픽셀을 상기 M * M번째 주소에 저장할 수 있다.
상기 주소 발생기는 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제1 웨이트 그룹을 적용할 복수의 인접 픽셀을 결정하며, 상기 프로세서는 상기 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 N * (M-1)번째 주소에 매핑되는 제1 출력 픽셀을 획득할 수 있다.
상기 프로세서는 상기 출력 피쳐맵에 상기 제1 레이어의 다음 레이어인 제2 레이어의 제2 웨이트 그룹을 적용하여 최종 출력 피쳐맵을 생성하고, 상기 주소 발생기는 외부 메모리로부터 상기 입력 피쳐맵을 로드하고, 상기 최종 출력 피쳐맵을 상기 외부 메모리로 전송할 수 있다.
상기 주소 발생기는 상기 입력 피쳐맵 및 상기 입력 피쳐맵에 포함된 복수의 입력 픽셀들의 주소를 획득하고, 상기 복수의 입력 픽셀들의 주소 중 상기 N * (M-1)번째 주소 및 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제1 웨이트 그룹을 적용할 변경된 위치를 결정하며, 상기 변경된 위치를 상기 프로세서로 전송하고, 상기 프로세서는 상기 변경된 위치에 인접한 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 출력 피쳐맵을 생성할 수 있다.
상기 주소 발생기는 상기 변경된 위치 및 상기 복수의 입력 픽셀들의 주소 정보를 비교한 결과에 기반하여 상기 복수의 인접 픽셀 중 일부를 패딩(padding)으로 설정할 수 있다.
본 발명의 실시예에 따르면, 시스톨릭 어레이를 이용함에 있어서, 피쳐맵 메모리에서 입력 피쳐맵에 대해 처음부터 패딩 영역 없이 온칩 메모리에 로드되도록 하고, 출력 피쳐맵 또한 패딩 영역 없이 온칩 메모리에 배치되도록 함으로써, 메모리 공간을 절약하여 메모리 공간을 효율적으로 활용할 수 있다.
또한, 본 발명의 실시예에 따르면, 컨볼루션, 배치 평준화, 액티베이션(activation) 및 풀링(pooling)을 실행할 경우, 한 레이어에 대한 처리가 종료된 후, 출력 피쳐맵을 피쳐맵 메모리에 저장하고 바로 다음 레이어에 대한 처리의 입력 피쳐맵으로 사용할 수 있어, 출력 피쳐맵을 별도로 외부 메모리로 전송할 필요가 없고 외부 메모리로부터 별도로 로딩할 필요가 없으므로, 외부 메모리에 대한 접근 절차를 줄일 수 있어 처리에 소요되는 연산 시간을 더욱 줄일 수 있다.
또한, 본 발명의 실시예에 따르면, 입력 피쳐맵을 온칩 피쳐맵 메모리에 로드한 상태에서, 출력 피쳐맵을 실시간으로 입력 피쳐맵이 저장된 공간의 앞부분부터 덮어 쓰면서 저장할 수 있어, 출력 피쳐맵에 대한 별도의 타일링 없이도 고속으로 출력 피쳐맵을 저장할 수 있고, 한정된 메모리 공간을 효율적으로 이용할 수 있다.
도 1은 본 발명의 실시예에 따른 입력 피쳐맵과 출력 피쳐맵을 도시한다.
도 2는 본 발명의 실시예에 따른 CNN 처리 장치를 도시한다.
도 3은 본 발명의 실시예에 따른 CNN 가속기의 상세 구성을 도시한다.
도 4는 본 발명의 실시예에 따른 프로세서 유닛의 동작을 도시한다.
도 5는 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵과 시스톨릭 어레이를 도시한다.
도 6 및 도 7은 종래 기술에 따른 패딩을 도시한다.
도 8 및 도 9는 종래 기술에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 10은 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 11은 종래 기술에 따른 메모리 공간에 대한 주소 할당 방법을 도시한다.
도 12는 종래 기술에 따른 주소 접근 방식을 도시한다.
도 13은 본 발명의 실시예에 따른 주소 접근 방식을 도시한다.
도 14는 본 발명의 실시예에 따른 입력 피쳐맵의 저장 공간을 출력 피쳐맵이 덮어쓰는 과정을 도시한다.
도 2는 본 발명의 실시예에 따른 CNN 처리 장치를 도시한다.
도 3은 본 발명의 실시예에 따른 CNN 가속기의 상세 구성을 도시한다.
도 4는 본 발명의 실시예에 따른 프로세서 유닛의 동작을 도시한다.
도 5는 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵과 시스톨릭 어레이를 도시한다.
도 6 및 도 7은 종래 기술에 따른 패딩을 도시한다.
도 8 및 도 9는 종래 기술에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 10은 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 11은 종래 기술에 따른 메모리 공간에 대한 주소 할당 방법을 도시한다.
도 12는 종래 기술에 따른 주소 접근 방식을 도시한다.
도 13은 본 발명의 실시예에 따른 주소 접근 방식을 도시한다.
도 14는 본 발명의 실시예에 따른 입력 피쳐맵의 저장 공간을 출력 피쳐맵이 덮어쓰는 과정을 도시한다.
아래에서는 첨부한 도면을 참고로 하여 본 발명의 실시예에 대하여 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자가 용이하게 실시할 수 있도록 상세히 설명한다. 그러나 본 발명은 여러 가지 상이한 형태로 구현될 수 있으며 여기에서 설명하는 실시예에 한정되지 않는다. 그리고 도면에서 본 발명을 명확하게 설명하기 위해서 설명과 관계없는 부분은 생략하였으며, 명세서 전체를 통하여 유사한 부분에 대해서는 유사한 도면 부호를 붙였다.
도 1은 본 발명의 실시예에 따른 입력 피쳐맵과 출력 피쳐맵을 도시한다.
도 1에 도시된 바와 같이, 본 발명의 실시예에 따르면, CNN 처리 장치의 각 레이어는 N장의 입력 피쳐맵을 사용하여 M장의 출력 피쳐맵을 생성할 수 있다.
컨볼루션 동작의 경우, CNN 처리 장치는 각 N장의 입력 피쳐맵 각각에 대해 서로 다른 K*K의 웨이트를 사용하여 하나의 출력 피쳐맵을 생성할 수 있으며, 이러한 N개의 K*K 웨이트는 M개의 출력 피쳐맵마다 다른 웨이트가 적용되기 때문에 K*K의 웨이트가 M*N개 있다.
즉, 어느 출력 피쳐 맵의 특정 위치에 있는 출력 픽셀의 값은 N개의 입력 피쳐맵의 대응되는 위치에 있는 인접 입력 픽셀들에 대해 주변에 K*K*N의 3차원 웨이트를 적용하여 각 웨이트와 입력 피쳐맵의 입력 픽셀들의 값을 각각 곱하고 모두 더한 후에 출력 피쳐 맵에 해당하는 바이어스(bias)를 더해서 얻게 된다.
CNN 처리 장치는 추가적으로 컨볼루션 후에 모든 값에 대해서 해당 레이어에 해당하는 평균값을 뺀다거나 표준편차로 나눠준다거나 원하는 값을 곱해주는 배치 평준화(batch normalization)를 적용할 수도 있다. 또한, CNN 처리 장치는 컨볼루션 후에는 양수만 통과시킨다거나 음수의 경우에 특정 값을 곱해 값을 작게 한다거나 하는 비선형 동작인 액티베이션을 적용할 수 있다. 또한, CNN 처리 장치는 이러한 컨볼루션과 액티베이션 후에는 풀링(pooing)을 할 수 있는데, 정해진 윈도우 크기, 예를 들어 2*2 윈도우에 대해서 가장 큰 값을 선택한다거나 평균을 낸다거나 하여 피쳐맵의 크기를 줄이게 된다. 구현에 따라 컨볼루션이나 배치 평준화, 액티베이션, 풀링 등을 각각의 레이어로 부를 수도 있고 몇 개를 합하여 하나의 레이어로 정의할 수도 있다.
도 2는 본 발명의 실시예에 따른 CNN 처리 장치를 도시한다.
도 2에 도시된 바와 같이, 본 발명의 실시예에 따르면, CNN 처리 장치(200)는 외부 메모리(201)와 연결되는 메모리 제어기(210), 주소 발생기(220), CNN 가속기(230), 복수의 프로세싱 코어(240), 그 외의 인터페이스 장치들(250) 및 이들을 연결하는 버스(260)를 포함할 수 있다.
컨볼루션 신경망(CNN)의 네트워크는 복수의 레이어로 구성될 수 있으며, 복수의 레이어에 대한 최초의 입력 데이터는 외부 메모리(201)에 저장될 수 있다. CNN 가속기를 사용하기 위해, 메모리 제어기(210)는 외부 메모리(201)와 연결되어 외부 메모리(201)의 데이터를 주소 발생기(210)로 전달할 수 있다.
주소 발생기(220)는 전달된 입력 데이터를 CNN 가속기(230)로 전달할 수 있고, CNN 가속기(230)로부터 출력 데이터를 수신하여 다시 외부 메모리(201)에 저장할 수 있다.
CNN 가속기(230)는 컨볼루션 신경망의 입력 데이터를 전부 CNN 가속기(230) 내부의 온칩(on-chip) 메모리(미도시)에 로드한 후 전체 레이어를 순차적으로 처리할 수 있다.
도 3은 본 발명의 실시예에 따른 CNN 가속기의 상세 구성을 도시한다.
도 3에 도시된 바와 같이, CNN 가속기(330)는 시스톨릭 어레이(Systolic Array) 형태로 구성될 수 있다. 시스톨릭 어레이는 하나의 명령 발생기(Sequence Generator)(331), 복수의 웨이트 메모리(332A-332D), 복수의 피쳐맵 메모리(333A-333D) 및 복수의 프로세서 유닛(334A-334P)을 포함할 수 있다.
복수의 프로세서 유닛(334A-334P) SA_H개의 행과 SA_W개의 열로 이루어져 있다.
피쳐맵 메모리(333A-333D)는 입력 피쳐맵과 출력 피쳐맵을 모두 저장하는 메모리를 SA_H개 포함할 수 있다. 한 레이어에 있어서, 입력 피쳐맵은 SA_H개의 메모리 뱅크(bank)에 나누어 저장된다. 또한, 계산 결과인 출력 피쳐맵도 SA_H의 메모리 뱅크에 나누어 저장된다.
웨이트 메모리(332A-332D)는 웨이트 값을 저장하는 메모리를 SA_W개 포함할 수 있다. 웨이트 메모리들은 각각 N개의 입력 피쳐맵으로부터 특정 출력 피쳐맵을 만들기 위한 웨이트 값들을 저장하고 있다. 웨이트 메모리들은 컨볼루션을 위한 K*K*N개의 웨이트와 함께 필요한 경우 배치 평준화를 위한 평균값, 표준편차값, 곱하기 스케일 값 등을 함께 저장할 수 있다.
따라서, CNN 처리 장치는 피쳐맵 메모리에 N개의 입력 피쳐맵이 로드된 상태에서 최대 SA_W개의 출력 피쳐맵을 생성할 수 있다. 출력 피쳐맵의 개수가 SA_W개를 넘을 경우, CNN 처리 장치는 로드된 N개의 입력 피쳐맵을 사용하여 웨이트 메모리의 웨이트를 바꾸면서 SA_W개씩의 출력 피쳐맵을 반복적으로 만들어 모든 출력 피쳐맵을 생성할 수 있으며, 이를 출력 피쳐맵 단위의 웨이트 타일링으로 정의할 수 있다. 피쳐맵 메모리에 입력 피쳐맵을 로드하고 계산 결과로 발생될 출력 피쳐맵을 하나의 피쳐맵 메모리에 저장할 수 없는 경우, CNN 처리 장치는 각 Wi*Hi 크기의 입력 피쳐맵을 X 또는 Y방향으로 복수의 타일로 균등 분할하고, 분할된 각 타일에 대해 SA_W개의 출력 피쳐맵의 타일들을 생성할 수 있으며, 이를 입력 피쳐맵 내의 입력 타일링(in-feature map input tiling)으로 정의할 수 있다.
CNN 처리 장치는 입력 피쳐맵이 큰 경우 입력 타일링을 이용할 수 있다. CNN 처리 장치는 각 입력 타일에 대해서 웨이트 메모리의 내용을 교체하여 해당 타일에 대한 출력 피쳐맵의 타일을 만들어내는 웨이트 타일링을 이용할 수 있다.
복수의 프로세서 유닛들(334A-334P) 중 각 행은 자신이 속한 행에 해당하는 피쳐맵 뱅크에서 제공하는 입력 피쳐맵을 처리할 수 있다. 각 프로세서 유닛들은 자신의 왼쪽의 프로세서 유닛으로부터 입력 피쳐맵 값과 처리할 명령을 수신할 수 있고, 자신의 윗쪽에서 웨이트 웨이트를 수신할 수 있으며, 전달받은 웨이트와 입력 피쳐맵 값을 사용하여 전달받은 명령에 대응되는 연산을 수행할 수 있다. 복수의 프로세서 유닛들은 연산 결과를 내부의 레지스터에 저장할 수 있고, 저장된 출력 피쳐맵을 최종 단계에서 자신의 왼쪽에 있는 프로세서 유닛으로 전달할 수 있다. 매 명령을 처리할 때, 각 프로세서 유닛은 명령의 처리와 동시에 왼쪽에서 전달받은 명령과 입력 피쳐맵 값은 자신의 오른쪽에 위치한 프로세서 유닛으로 전달하고, 위에서 전달받은 웨이트 값은 자신의 아래쪽에 위치한 프로세서 유닛으로 전달할 수 있다. 이로써, 자신의 오른쪽에 있는 프로세서 유닛들은 자신이 사용했던 동일한 입력 피쳐맵 입력값을 사용할 수 있고, 그 다음 출력 피쳐맵에 대응되는 웨이트값을 사용하여 동일한 연산을 사용할 수 있으며, 자신의 아래에 위치한 프로세서 유닛들은 자신이 사용했던 동일한 웨이트 값(자신이 담당하는 출력 피쳐맵에 해당하는)을 사용하고, 입력 피쳐맵의 다른 뱅크의 같은 위치에 해당하는 값을 사용하여 자신과 같은 연산을 하도록 한다.
따라서, 동일한 행에 위치한 프로세서 유닛들은 동일한 입력 피쳐맵에 대해서 다른 웨이트를 사용하여 해당 위치에 대한 다른 출력 피쳐맵을 생성할 수 있고, 동일한 열에 위치하는 프로세서 유닛들은 동일한 웨이트를 사용하여 동일한 출력 피쳐맵의 해당 뱅크에 사용하는 부분을 생성할 수 있다.
명령 발생기(331)는 각 프로세서 유닛들이 각각 왼쪽의 피쳐맵 메모리에서 전달되는 피쳐맵과 윗쪽의 웨이트 메모리에서 전달되는 웨이트 값을 사용하여 컨볼루션과 배치 평준화(batch normalization) 및 풀링을 할 수 있도록 하는 명령을 생성하여 각 프로세서 유닛들로 전달할 수 있다.
명령 발생기(331)는 웨이트 적용을 위하여 입력 피쳐맵 값과 웨이트 값을 곱하여 저장하거나 누적하여 저장하거나 배치 평준화를 위하여 전달받은 웨이트값을 저장된 값에서 빼거나 나누거나 곱하는 것을 지시하는 내용을 생성할 수 있다. 구현에 따라서는, 빼기나 나누기는 웨이트의 역원을 더하거나 곱하는 것으로 대체할 수 있다.
명령 발생기(331)는 풀링을 위해서는 풀링 윈도우에 대해서 생성된 값을 내부의 풀링용 레지스터에 저장하거나 기존 저장된 풀링 레지스터 값과 비교하여 선택하거나 풀링용 레지스터를 이용하여 풀링 윈도우 내에서 평균을 내어 풀링용 레지스터에 저장하는 동작을 지시하는 풀링 코드를 생성할 수 있다.
또한, 명령 발생기(331)는 최종 계산된 출력 피쳐맵들을 왼쪽으로 쉬프팅(shifting)하면서 각 피쳐맵 메모리로 전달하도록 하는 명령도 생성할 수 있다.
프로세서 유닛들의 각 컬럼은 각 출력 피쳐맵을 생성할 수 있다. 프로세서 유닛들의 각 행은 입력 피쳐맵들이 균등 분할하여 저장된 각 뱅크들을 담당하게 된다. 또한, 프로세서 유닛들의 각 행에서 계산된 피쳐맵들은 다시 입력 피쳐맵이 저장되어 있는 동일한 메모리 뱅크로 전달된다. CNN 처리 장치는 풀링 동작이 동일한 뱅크에 대해서 이루어지도록 입력 피쳐맵을 나누어 저장할 수 있다.
도 4는 본 발명의 실시예에 따른 프로세서 유닛의 동작을 도시한다.
도 4에 도시된 바와 같이, 각 프로세서 유닛(434)이 해야 할 동작은 명령에 의해 정해지는데, 최초의 명령을 수신하고, 다음 프로세서 유닛(아래에 있는 프로세서 유닛 또는 오른쪽에 있는 프로세서 유닛)으로 전달하게 되어 있다. 오른쪽이나 아래에 있는 프로세서 유닛들에는 명령이 전달되는 것과 동시에 해당하는 데이터도 같은 시간에 도착하게 되어 있으므로, 마치 모든 프로세서 유닛들이 시간차를 두고 같은 동작을 하게 되는 것이다.
프로세서 유닛은 컨볼루션을 위해 계산해 낼 특정 출력 피쳐맵의 한 지점에 해당하는 N개의 입력 피쳐맵의 K*K 값에 대해 웨이트와 입력 피쳐맵 값을 곱하여 누적하는 동작을 N*K*K번 수행하며, 이렇게 만들어진 값에 대해 필요한 경우 배치 정규화(batch normalization, 평균값을 빼고, 표준편차로 나눈 후, 다시 어떤 스케일 값을 곱하는 동작)와 함께 출력 피쳐맵에 해당하는 바이어스 값을 더하고, 이렇게 만들어진 주변 값들(예를 들어 2x2)에 대해 최대값을 선택하거나 평균을 내는 동작을 하게 된다.
도 5는 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵과 시스톨릭 어레이를 도시한다.
도 5에 도시된 바와 같이, 본 발명의 실시예에 따르면, 제일 왼쪽과 윗쪽에 위치한 프로세서 유닛들은 주소 발생기(AG,Address Generator) 및 명령 발생기에서 직접 읽혀진 웨이트, 입력 피쳐맵 및 명령들을 직접 전달받으며, 나머지 프로세서 유닛들은 자신의 왼쪽과 윗쪽에 위치한 프로세서 유닛들로부터 각각 입력 피쳐맵과 웨이트값을 수신할 수 있다. 구현에 따라 명령은 왼쪽에서 받도록 할 수도 있고 윗쪽에서 받게 할 수도 있다. 동일한 계산은 왼쪽 위부터 전파되어 오른쪽 아래까지 시간차를 가지고 진행하게 된다.
피쳐맵 메모리는 이렇게 계산된 출력 피쳐맵들을 저장할 수 있다. 주소 발생기는 상기한 동작들이 가능하도록 내부의 메모리에서 읽을 주소를 생성하고, 주소를 각 프로세서 유닛들로 전달하며, 계산이 끝난 출력 피쳐맵이 수신되면 출력 피쳐맵을 저장할 주소를 작성한다.
상기한 방식과 같은 주소의 생성 과정은 왼쪽 메모리에 데이터를 저장하는 방식과 각 프로세서 유닛에서 계산을 할 순서에 따라 달라질 수 있다.
도 6 및 도 7은 종래 기술에 따른 패딩을 도시한다.
도 6에 도시된 바와 같이, 컨볼루션을 하기 위해서는 각 입력 피쳐맵의 값들을 중심으로 K*K의 웨이트를 곱하는데, 가장자리에 있는 값들에 대해서는 주변에 없는 값들이 있기 때문에 패딩 값을 채우게 된다. 폭 Wi, 높이 Hi인 피쳐맵을 컨볼루션하기 위해서는 피쳐맵의 상, 하, 좌, 우 바운더리 바깥으로 [K/2]([X]는 X보다 크지않은 최대 정수) 줄의 패딩 영역이 필요하다. 패딩 값으로 보통 0을 사용할 수 있다. 웨이트의 크기가 3x3 인 경우 패딩은 한 줄씩, 5x5 웨이트인 경우 두 줄씩의 패딩이 필요하다.
도 7에 도시된 바와 같이, 종래 기술의 방법은, 시스톨릭 어레이를 통한 컨볼루션 처리를 위해 입력 피쳐맵들을 상기 피쳐맵 메모리에 로드할 때, 컨볼루션에 필요한 패딩 영역에 메모리 공간을 할당하면서 로드한다. 이 방법에서는 피쳐맵의 원래의 행수에 상, 하로 P = [K/2] 행을 추가한 후, 그 전체의 행들을 SA_H 개의 뱅크에 나누어 로드한다.
각 뱅크가 담당할 행의 수를 BH라고 하면 원래의 피쳐맵의 높이를 H, 각 바운더리에 패딩이 P가 필요할 때, 패딩을 포함한 전체의 행을 SA_H의 뱅크에 나누어 처리되도록 하고, 추가적으로 풀링을 하는 경우 풀링 윈도우는 동일한 뱅크안에서 포함되도록 할 수 있다. BH는 BH = [(H+2*P)/SA_H]로 계산될 수 있고, BH에 풀링 윈도우의 사이즈 pool_win_size를 더할 수 있다.
패딩을 하기 때문에 뱅크에 올라가는 폭도 BW = W+2*P가 된다. 주소 발생기를 통해 외부 메모리에서 데이터를 피쳐맵 메모리에 로드할 때는, 공간은 비워둔 상태이며 패딩 영역은 채우지 않는다.
따라서 각 프로세서 유닛들의 행(row)는 각각 입력 채널 수 N장의 높이 BH, 넓이 BW를 가지는 작은 입력 피쳐맵을 처리하게 되는데, 실제로 데이터 처리를 위해 읽어낼 때는 각 뱅크에서 BH*BW 개의 데이터를 실제 유효 데이터를 중심으로 읽어내게 되며, 이 경우 모든 뱅크에서 한 클럭(또는 명령의 처리 싸이클 차이)을 차이에 두고 같은 패턴으로 읽을 수 있어, 시스톨릭 어레이 방식의 처리가 가능하다.
각 프로세서 유닛은 풀링을 하는 경우도 풀링 윈도우에 대해 루프를 추가하여 읽어내는 명령을 추가하면 처리할 수 있으며, 각 뱅크에 대해 BH*BW 데이터에 대해 여러 개의 명령을 처리하여 N개의 입력 피쳐맵에서 M개의 출력 피쳐맵을 만들 수 있다.
입력 타일의 원래 크기가 높이 H, 폭 W이고 예를 들어 3x3의 웨이트를 쓰는 경우 위, 아래, 왼쪽, 오른쪽에 각각 한 줄씩 패딩을 추가하여 (H+2)*(W+2)의 피쳐맵 데이터가 위치하게 된다. 메모리 로딩을 통해 외부 메모리로부터 입력 피쳐맵을 로딩할 경우, 패딩 부분은 채우지 않고 그냥 자리만 비워두며, 입력 피쳐맵을 각 프로세서 유닛으로 전송할 때 0으로 채워 보낸다.
SA가 높이 방향으로 SA_H개의 행, 넓이 방향으로 SA_W개의 열(컬럼)으로 이루어져 있는 경우, 왼쪽의 피쳐맵 메모리는 SA_H개의 물리적인 메모리로 구성되는데, 위의 패딩이 된 데이터를 나누어 저장하기 위해서는 하나의 메모리에 BH = [(H+2)*(W+2)/SA_H] 줄 만큼 저장된다.
도 8 및 도 9는 종래 기술에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 8에 도시된 바와 같이, SA_H가 4이고 H가 14인 경우, 패딩이 포함된 입력 피쳐맵이 피쳐맵 메모리 SA_H개에 나뉘어 저장될 수 있다.
시스톨릭 어레이의 각 프로세서 유닛들은 각각 자신이 속하는 뱅크의 입력 피쳐맵을 처리하여 출력 피쳐맵을 생성하는데, 뱅크 내부에서 처리할 입력 피처맵 데이터의 위치와 취할 동작(operation)까지 모두 동일해야 한다는 조건이 있으며, 이를 시스톨릭 어레이 조건이라 정의할 수 있다. 각 뱅크에서 읽어낼 입력 피쳐맵의 주소를 자신의 위치까지 고려하여 따로 만들어내는 방식도 가능하나, 대부분의 경우 읽을 주소를 주소 발생기가 생성하고, 동일한 주소(번지)를 모든 프로세서 유닛들에게 전송하는 방식을 사용한다.
입력 피쳐맵을 피쳐맵 메모리에 로딩할 때 패딩 영역이 있는 경우에, 그 다음 레이어가 컨볼루션 레이어이며 다시 패딩이 필요한 경우에, 컨볼루션 결과가 패딩 위치를 고려하여 배치되도록 할 수 있다면, 계산된 결과를 외부 메모리에 전송하고 다시 로드하는 과정이 필요없으며, 바로 컨볼루션을 할 수 있기 때문에서, 매우 높은 성능을 얻을 수 있을 것이다.
그러나 피쳐맵 메모리의 입력 피쳐맵이 패딩 영역을 포함하고 피쳐맵 메모리에 생성될 출력 피쳐맵이 패딩 영역을 포함하도록 하기 위해서는 도 7과 같이 K*K의 웨이트 중심의 위치가 변하지 않도록 결과를 저장해야 하며, 맨 위쪽과 맨 아래쪽의 행에서는 세 개의 출력 행을 만들어 내야 한다. 다만, 중간에 위치한 두 번째와 세 번째 행은 네 개의 출력 행을 만들어 내야 하기 때문에, 즉, 주소 발생기에서 생성한 주소를 하위 뱅크로 전파하면서 그대로 사용할 수는 없기 때문에, 시스톨릭 어레이 조건에 어긋나게 된다.
따라서, 도 9에 도시된 바와 같이, 피쳐맵 메모리에서 패딩 영역을 포함하는 경우에는 부득이하게 입력 피쳐맵은 패딩을 포함하되 출력 피쳐맵은 패딩을 포함하지 않는 형태로 만들어낼 수 밖에 없다.
다만, 도 9와 같이 입력 피쳐맵과 출력 피쳐맵을 구성하는 경우, 시스톨릭 어레이 규칙에 위배되지 않으므로 빠르게 처리할 수는 있으나, 계산된 출력 피쳐맵을 즉시 패딩을 필요로 하는 다음 레이어(예: 패딩이 필요한 컨볼루션 레이어)에서 사용할 수가 없으므로, 외부 메모리로 뽑아 냈다가 다시 패딩을 포함하도록 읽어들여야 하는 단점이 있다.
또한, 도 8 또는 도 9와 같이, 패딩 공간을 고려하여 출력 피쳐맵을 피쳐맵 메모리에 저장하고자 하는 경우, 한 프로세서 유닛 행의 계산 결과인 출력 피쳐맵을 다음 프로세서 유닛 행의 피쳐맵 메모리에 저장해야 하는 경우도 발생하고, 패딩 공간으로 인해 피쳐맵 메모리의 공간을 낭비한다는 단점도 있다.
도 10은 본 발명의 실시예에 따른 입력 피쳐맵 및 출력 피쳐맵을 도시한다.
도 10에 도시된 바와 같이, 본 발명의 실시예에 따른 CNN 처리 장치는 피쳐맵 메모리에서 입력 피쳐맵에 대해서 처음부터 패딩 구간에 공간을 할당하지 않고 출력 피쳐맵도 패딩이 없이 배치되도록 함으로써 메모리 공간도 절약하고, 한 계층의 처리가 끝난 후 데이터가 피쳐맵 메모리에 저장된 상태에서 외부 메모리로 나갔다 오지 않고 바로 다음 계층의 컨볼루션의 입력으로 사용될 수 있도록 할 수 있다.
본 발명의 실시예에 따른 CNN 처리 장치는 SA_H개의 행과 SA_W개의 열을 가지는 프로세서 유닛들을 사용하고, 프로세서 유닛 어레이의 왼쪽에는 해당 프로세서 유닛의 행에 입력 피쳐맵을 공급하고, 해당 프로세서 유닛의 행에서 오는 출력 피쳐맵을 저장하기 위한 SA_H개의 피쳐맵 메모리를 가지고, 프로세서 유닛 어레이의 윗쪽에는 해당 프로세서 유닛의 열이 사용할 웨이트를 공급하기 위한 SA_W개의 웨이트 메모리를 가지는 시스톨릭 어레이를 사용하여 컨볼루션, 배치 평준화, 액티베이션 및 풀링을 처리할 수 있다.
본 발명의 실시예에 따른 CNN 처리 장치는 주소 발생기를 통해 입력 피쳐맵을 SA_H개의 피쳐맵 메모리에 로드할 때, K x K 웨이트의 적용에 필요한 패드 영역에 따로 메모리 공간을 할당하지 않고, 계산된 결과인 출력 피쳐맵도 다음 레이어에서 컨볼루션에 패딩이 필요하더라도 패딩 공간을 비워두지 않고 실제 출력 피쳐맵만 저장할 수 있다.
따라서, 주소 발생기에서 입력 피쳐맵을 로드할 때도 패딩 영역을 더하지 않은 원래의 피쳐맵의 높이를 SA_H 개의 뱅크에 균일하게 분배하되, CNN 처리 장치는 풀링을 하는 경우 동일한 뱅크에 있는 출력 피쳐맵은 같은 풀링 윈도우에 포함되도록 조절할 수 있다.
상기와 같이 컨볼루션을 수행할 경우, 사용되는 뱅크 내에서의 행의 개수 BH는 BH = [H/SA_H]가 될 수 있고, BH에 BH를 pool_size로 나눌 때의 나머지를 추가할 수 있다.
예를 들어 원래의 입력 피쳐맵의 높이 H가 14이고 SA_H가 4인 경우, 그리고 2*2 풀링을 함꼐 처리하는 경우, [14/4] = 4이고, 4는 2로 나뉘어 떨어지므로 나머지가 0이 되어, BH=4가 된다.
본 발명에서는 주소를 계산함에 있어서, 주소 발생기는 K*K 웨이트 부분의 인덱스는 각 방향에 대해 0부터 K-1을 사용하지만, 입력 피쳐맵 복수의 입력 픽셀들 중 웨이트와 컨볼루션을 계산할 입력 픽셀 그룹의 시작 좌표는 그 인덱스에서 패딩의 양에 해당하는 값 [K/2] 만큼을 빼서 결정할 수 있다.
이에 따라 계산된 인덱스(컨볼루션을 계산할 입력 픽셀 그룹들의 위치)가 폭이나 높이 방향에 대해서 원래의 입력 피쳐맵의 주소 범위를 벗어나는 경우, 주소 발생기는 이를 패딩 위치로 간주하여 해당 번지를 읽지 않고 0으로 채워서 내보내게 한다.
또한, 본 발명의 실시예에 따르면, 상기와 같은 방식으로 생성된 출력 피쳐맵을 다음 레이어의 입력 피쳐맵으로 사용할 수 있다. N번째 레이어의 입력 피쳐맵에 대한 출력 피쳐맵이 생성된 후, 출력 피쳐맵을 주소 발생기를 통해 외부 메모리(DDR3/4)로 내보내지 않고 다음 레이어의 입력으로 사용할 수 있다.
상기한 방식을 통해, 외부 메모리(DDR)와 내부의 온칩 피쳐맵 메모리 사이에 주소 발생기를 통한 데이터 전달을 최소화하면서 전체 CNN 네트워크를 실행시킬 수 있어, CNN 처리에 필요한 계산 시간이 현저히 줄어들 수 있다.
도 11은 종래 기술에 따른 메모리 공간에 대한 주소 할당 방법을 도시한다.
도 11에 도시된 바와 같이, 각 메모리 뱅크는 하나의 메모리이며, 주소 발생기는 3차원적인 구조를 가지는 데이터에 대해서 사용하는 순서에 따라 일정한 규칙을 가지고 번지를 생성해 내게 된다.
종래 기술의 경우, 높이가 BH이고 폭이 BW인 입력 피쳐맵이 N개 있는 경우(N개의 채널) 주소 발생기는 채널 단위로 입력 피쳐맵을 순서대로 저장하고, 채널 안에서는 위부터 아래의 행 단위로, 행 안에서는 좌부터 우까지의 열 단위로 저장할 수 있다. 이 경우 채널 c의 행 h, 열 w인 데이터는 c*BH*BW+h*BW+w 번째에 놓이게 된다. 이렇게 저장하는 경우, 시스톨릭 어레이를 이용하여 컨볼루션 동작 시 각 프로세서 유닛이 한 출력 채널의 데이터를 만들어 내고, 그 값은 모든 입력 채널의 해당하는 위치의 값을 모두 사용하여야 하므로, 채널 방향으로 읽어내야 하고 그것을 K*K의 모든 웨이트의 위치마다 처리하여야 N*K*K개의 값을 MAC(multiply and accumulate)하게 되는 것이다.
만약에 배치 평준화를 하는 경우, 웨이트를 사용한 MAC 동작 후에 해당 출력 피쳐맵에 해당하는 추가적인 웨이트를 사용하며, 계산된 값에 값을 빼거나(더하거나) 나누거나(곱하거나) 하는 동작을 하고, 정해진 액티베이션을 하게 된다.
만약에 시스톨릭 어레이를 사용하여 P*P 윈도우 풀링을 하는 경우, 이 풀링 윈도우의 각 위치에 대해서 위와 같은 처리를 하여 최대값 또는 평균값을 계산해 내므로, 시간이 오래 걸린다는 단점이 있다.
시스톨릭 어레이로 처리하는 경우에 각 뱅크에서 읽어낼 입력 피쳐맵의 주소를 위해, 여러 개의 다중 루프 카운트를 사용해야 하는데, 미리 정해진 데이터의 배치에 따른 주소 규칙에 따라 각 루프에 대해서 루프의 수와 각 루프 안에서 번지의 증가량을 미리 설정하고, 상위(바깥)에서 정해지는 주소에 상대적으로 자신(하위,안쪽)의 주소 증가분을 더하는 식으로 계산할 수 있다.
아래의 코드는 출력 피쳐맵의 좌표에 대해 수직, 수평 방향으로 처리하고, 그 안에서 수직, 수평 방향 풀링 위치에 대해 처리하고, 각 값에 대해 K*K 웨이트를 처리하되, 각 웨이트 위치에 대해 채널 방향으로 먼저 처리하는 방식(K*K의 각각에 대해서 N방향으로 처리하는 방식)에서의 주소 생성 방법을 보여 준다.
bw : input width in bank including pad
bh : input height in bank including pad
pl : pooling window size
pd : pad size(=floor(K/2))
fy_loop = bh/pl;
fy_inc = bw*pl;
fx_loop = bw-2*pd;
fx_inc = pl;
py_loop = pl;
py_inc = bw;
px_loop = pl;
px_inc = 1;
ky_loop = K;
ky_inc = bw;
kx_loop = K;
kx_inc = 1;
c_loop = N;
c_inc = bw*bh;
fy_addr = in_feature_start_addr;
for(fy=0; fy < fy_loop; fy++) { // loop for sliding window y
fx_addr = fy_addr;
fy_addr += fy_inc;
for(fx=0; fx < fx_loop; fx++) { // loop for sliding window x
py_addr = fx_addr;
fx_addr += fx_inc;
for(py=0; py < py_loop; py++) { // loop for pooling y
px_addr = py_addr;
py_addr += py_inc;
for(px=0; px < px_loop; px++) { // loop for pooling x
ky_addr = px_addr;
px_addr += px_inc;
for(ky=0; ky < ky_loop; ky++) { // loop for Ky
kx_addr = ky_addr;
ky_addr += ky_inc;
for(kx=0; kx < kx_loop; kx++) { // loop for Kx
c_addr = kx_addr;
kx_addr += kx_inc;
for(c=0; c < c_loop; c++) { // loop for in-channel
in_bank_addr = c_addr;
c_addr += c_inc;
ypos = fy*pl + py + ky; // y position in padded in-feature
xpos = fx*pl + px + kx; // x position in padded in-feature
// padding location decod using ypos,xpos and tile, bank boundary info
if (ypos, xpos is padding area)
flag padding;
if (ypos >= bank height) {
bank_id ++; // read next bank
bankaddr = in_bank_addr - (bw*bh);
}
else
bankaddr = in_bank_addr;
read data at bank_id, addr bankaddr, overwrite padding if needed;
}
// loop for in-channel
}
// loop for Kx
}
// loop for Ky
// possible batch-norm and pooling here
}
// loop for pooling x, px
}
// loop for pooling y, py
}
// loop for sliding window
x, fx
}
// loop for sliding window y, fy
마찬가지로 데이터 출력을 위한 번지 생성은 Pseudo 코드(의사 코드)로 아래와 같이 표시할 수 있다. 출력 피쳐맵의 수직, 수평 방향으로 처리하고 각 위치에 대해서는 출력 채널들을 써 넣는 방식을 보여 준다.
bw : output width in bank with no pad
bh : output height in bank with no pad
pl : pooling window size
pd : pad size(=floor(K/2))
fy_loop = bh/pl;
fy_inc = (bw-2*pd)/pl;
fx_loop = (bw-2*pd)/pl;
fx_inc = 1;
c_loop = active_systolic_array_columns;
c_inc = (bw-2*pd)/pl * bh/pl;
fy_addr = out_feature_start_addr;
for(fy=0; fy < fy_loop; fy++) { // loop for sliding window y
fx_addr = fy_addr;
fy_addr += fy_inc;
for(fx=0; fx < fx_loop; fx++) { // loop for sliding window x
c_addr = fx_addr;
fx_addr += fx_inc;
for(c=0; c < c_loop; c++) { // # of active systolic array column
out_addr = c_addr;
c_addr += c_inc;
write output data to out_addr;
} // # of active systolic array column (M dir), c
} // loop for sliding window
x, fx
} // loop for sliding window y, fy
각 웨이트 메모리에서 웨이트를 읽어내는 규칙은 아래와 같이 나타낼 수 있다. 만들어 낼 데이터에 대해 모든 오퍼레이션에 필요한 웨이트를 반복해서 읽어내게 된다.
bw : input width in bank including pad
bh : input height in bank including pad
pl : pooling window size
pd : pad size(=floor(K/2))
fy_loop = bh/pl;
fy_inc = bw*pl;
fx_loop = bw-2*pd;
fx_inc = pl;
py_loop = pl;
py_inc = bw;
px_loop = pl;
px_inc = 1;
ky_loop = K;
ky_inc = bw;
kx_loop = K;
kx_inc = 1;
c_loop = N;
c_inc = bw*bh;
for(fy=0; fy < fy_loop; fy++) { // loop for sliding window y
for(fx=0; fx < fx_loop; fx++) { // loop for sliding window x
for(py=0; py < py_loop; py++) { // loop for pooling y
for(px=0; px < px_loop; px++) { // loop for pooling x
for(ky=0; ky < ky_loop; ky++) { // loop for Ky
for(kx=0; kx < kx_loop; kx++) { // loop for Kx
for(c=0; c < c_loop; c++) { // loop for N
p = ky*(kx_loop)*(c_loop) + kx*(c_loop) + c;
read addr p;
} // loop for N
} // loop for Kx
} // loop for Ky
for (batch norm and activation weight counts) {
p++, read addr p;
}
} // loop for pooling x, px
} // loop for pooling y, py
} // loop for sliding window x, fx
} // loop for sliding window y, fy
상기한 바와 같이, 종래 기술에 따른 주소 처리 방법에서는 피쳐맵 메모리에 입력 맵과 함께 계산된 결과인 출력 피쳐맵을 입력 피쳐맵과 별도의 공간에 나누어 저장하는 방식인데, 이것은 메모리 사용에 있어서 효율적이지 않다.
만약에 계산된 출력 피쳐맵 결과가 입력 피쳐맵을 덮어 쓰면서 계산되는 방식이라면 더 큰 크기의 피쳐맵을 한번에 올릴 수 있어 입력 피쳐맵 타일링(in-feature-map tiling - 입력 피쳐맵을 X-Y 도메인에서 나누어 처리하는 것)을 하지 않고도 처리할 수 있어 시간을 절약할 수 있을 것이다. 그러나 앞에 기술된 방식에서는 입력 데이터를 사용할 때도 채널 단위로 스캐닝을 먼저 하는 과정에서 번지가 채널 단위로 뛰기(jump) 때문에 입력 피쳐맵의 거의 전체 번지를 처음부터 스캐닝하게 되어 있고, 출력 피쳐맵이 생성될 때도 번지 생성의 제일 안쪽에 출력 채널 단위의 루프가 있고 피쳐맵 메모리 상에서 출력 피쳐맵들이 채널 단위로 차례로 위치하므로 출력- 번지도 채널 단위로 점프하면서 거의 전체 피쳐맵을 계속 스캐닝하면서 쓰도록 하고 있어 입력 피쳐맵을 앞에서부터 덮어 쓰는 방식을 쓰고 싶어도 초기부터 계산 결과가 나중에 사용할 입력 피쳐맵의 뒷부분을 덮어 쓰게 되어 있어 그것을 힘들게 한다.
도 12는 종래 기술에 따른 주소 접근 방식을 도시한다.
도 12에 도시된 바와 같이, 종래 기술에 따르면, 메모리의 주소는 먼저 dim0에 따라 메모리에서의 낮은 번지와 높은 번지가 정해지고, 같은 dim0 수준에서는 dim1에 따라 낮은 번지와 높은 번지가 정해지고, 같은 dim1 수준에서는 dim2에 따라 낮은 번지와 높은 번지가 정해짐을 나타낸다.
종래 기술의 경우, 입력 피쳐맵을 로드할 때에 입력 채널 단위로 주소 점프가 발생하고, 출력 피쳐맵을 저장할 때에도 마찬가지로 출력 채널 단위로 주소 점프가 발생하여, 전체적인 연산 속도를 저하시킨다는 단점이 있다.
도 13은 본 발명의 실시예에 따른 주소 접근 방식을 도시한다.
도 13에 도시된 바와 같이, 본 발명의 실시예에 따르면, 시스톨릭 어레이를 이용한 CNN 처리를 위해, 데이터를 피쳐맵 메모리에 로드한 상태에서 계산된 출력피쳐맵이 입력 피쳐맵을 앞부분부터 덮어 쓰면서 동작하도록 할 수 있으며, 주어진 메모리를 사용하여, 시스톨릭 어레이의 왼쪽의 피쳐맵 메모리에 입력 피쳐맵과 출력 피쳐맵을 모두 한번에 올릴 수 있다.
본 발명의 실시예에 따르면, 읽기 번지를 생성하는 데 있어서 주소의 매핑을 기존의 방식과 다르게 하기 위하여, 각 루프의 번지의 증가량을 새롭게 정의할 수 있다. 또한, 시스톨릭 어레이 특성상 출력 피쳐맵을 다시 피쳐맵 메모리에 저장할 때, 프로세서 유닛의 각 행 별로 동일한 위치에 대해서 출력 채널별로 데이터가 쓰여지게 되어 있는데, 입력 피쳐맵 또는 출력 피쳐맵에서의 주소를 정의할 때 채널 별 같은 위치가 연속된 번지에 놓이도록 번지를 정의할 수 있으며, 이에 따라 메모리 상에서 입력 피쳐맵이 저장된 공간에 출력 피쳐맵이 차례로 주소 공간 중에서 초기 주소부터 마지막 주소까지 순서대로 쓸 수 있다.
본 발명의 실시예에 따르면, 주소 발생기는 뱅크 메모리 상에서 주소는 먼저 dim0에 따라 메모리에서의 낮은 주소와 높은 주소를 정할 수 있고, 같은 dim0 수준에서는 dim1에 따라 낮은 주소와 높은 주소를 정할 수 있으며, 같은 dim1 수준에서는 dim2에 따라 낮은 주소와 높은 주소를 정할 수 있다.
종래 기술에 따른 세 pseudo 코드에서는 N개의 채널의 입력 피쳐맵에 대한 KxK 컨볼루션을 할 때 먼저 N개의 채널 방향으로 처리하는 것을 제일 안쪽 루프에 두었으나, 본 발명의 실시예에 따를 경우 채널 루프를 Kernel Y, Kernel X 루프 밖으로 이동할 수 있다.
아래의 코드는 채널 루프를 Kernel Y, Kernel X 루프 밖으로 두는 경우의 피쳐맵 읽기 번지를 증가시키는 코드에서 수정된 pooling-x 안쪽의 루프를 보여 준다.
for(px=0; px < px_loop; px++) { // loop for pooling x
c_addr = px_addr;
px_addr += px_inc;
for(c=0; c < c_loop; c++) { // loop for in-channel
ky_addr = c_addr;
c_addr += c_inc;
for(ky=0; ky < ky_loop; ky++) { // loop for Ky
kx_addr = ky_addr;
ky_addr += ky_inc;
for(kx=0; kx < kx_loop; kx++) { // loop for Kx
in_bank_addr = kx_addr;
kx_addr += kx_inc;
ypos = fy*pl + py + ky; // y position in padded in-feature
xpos = fx*pl + px + kx; // x position in padded in-feature
// padding location decode using ypos,xpos and tile, bank boundary info
if (ypos, xpos is padding area)
flag padding;
if (ypos >= bank height) {
bank_id ++; // read next bank
bankaddr = in_bank_addr - (bw*bh);
}
else
bankaddr = in_bank_addr;
read data at bank_id, addr bankaddr, overwrite padding if needed;
}
// loop for in-channel
}
// loop for Kx
}
// loop for Ky
// possible batch-norm and pooling here
}
// loop for pooling x, px
채널 루프를 Kernel Y, Kernel X 루프 밖으로 이동하는 경우, 출력 번지 발생순서는 변화가 없으며, 웨이트 읽기 부분은 마찬가지로 아래와 같이 수정하고, 웨이트는 수정된 순서대로 미리 웨이트 메모리에 저장해 두면 된다.
for(px=0; px < px_loop; px++) { // loop for pooling x
for(ky=0; ky < ky_loop; ky++) { // loop for Ky
for(kx=0; kx < kx_loop; kx++) { // loop for Kx
for(c=0; c < c_loop; c++) { // loop for N
p = ky*(kx_loop)*(c_loop) + kx*(c_loop) + c;
read addr p;
}
// loop for N
}
// loop for Kx
}
// loop for Ky
for (batch norm and activation weight counts) {
p++, read addr p;
}
}
// loop for pooling x, px
피쳐맵 뱅크에서의 번지 발생을 C 코드로 표시하면, 앞의 기존의 입력 피쳐맵 읽기 방법에서 아래와 같이 각 loop의 increment 값을 수정하고 padding 영역 판단하는 부분을 수정하는 것과 같다.
bw : input width in bank with no pad
bh : input height in bank with no pad
pl : pooling window size
pd : pad size(=floor(K/2))
fy_loop = bh/pl;
fy_inc = N*bw*pl; //bw*pl;
fx_loop = bw;
fx_inc = N*pl; //pl;
py_loop = pl;
py_inc = N*bw; //bw;
px_loop = pl;
px_inc = N; //1;
ky_loop = K;
ky_inc = N*bw; //bw;
kx_loop = K;
kx_inc = N; //1;
c_loop = N;
c_inc = 1; //bw*bh;
fy_addr = in_feature_start_addr;
for(fy=0; fy < fy_loop; fy++) { // loop for sliding window y
fx_addr = fy_addr;
fy_addr += fy_inc;
for(fx=0; fx < fx_loop; fx++) { // loop for sliding window x
py_addr = fx_addr;
fx_addr += fx_inc;
for(py=0; py < py_loop; py++) { // loop for pooling y
px_addr = py_addr;
py_addr += py_inc;
for(px=0; px < px_loop; px++) { // loop for pooling x
ky_addr = px_addr;
px_addr += px_inc;
for(ky=0; ky < ky_loop; ky++) { // loop for Ky
kx_addr = ky_addr;
ky_addr += ky_inc;
for(kx=0; kx < kx_loop; kx++) { // loop for Kx
c_addr = kx_addr;
kx_addr += kx_inc;
for(c=0; c < c_loop; c++) { // loop for in-channel
in_bank_addr = c_addr;
c_addr += c_inc;
ypos = fy*pl + py + ky - pd; // y position in in-feature
xpos = fx*pl + px + kx - pd; // x position in in-feature
if(first_row & ypos < 0))
pad with 0;
else if(xpos < 0))
pad with 0;
else if(xpos >= W))
pad with 0;
else if(last_row & ypos >= last_bank_bank_height))
pad with 0;
else {
if(ypos >= bankheight) {
// change to below bank
read next bank at bankaddr = address - pdmai->dst_choffset;
}
else {
read current bank at bankaddr = address;
}
}
read data at bank_id, addr bankaddr, overwrite padding if needed;
}
// loop for in-channel
}
// loop for Kx
}
// loop for Ky
// possible batch-norm and pooling here
}
// loop for pooling x, px
}
// loop for pooling y, py
}
// loop for sliding window
x, fx
}
// loop for sliding window y, fy
출력 피쳐맵을 저장할 때의 번지도 아래와 같이 새로 정의된 번지 체계에 따라 increment를 수정하여 생성하면 된다.
bw : input width in bank with no pad
bh : input height in bank with no pad
pl : pooling window size
pd : pad size(=floor(K/2))
fy_loop = bh/pl;
fy_inc = N*bw/pl; //(bw-2*pd)/pl;
fx_loop = bw/pl; //(bw-2*pd)/pl;
fx_inc = N; //1;
c_loop = active_systolic_array_columns;
c_inc = 1; //(bw-2*pd)/pl * bh/pl;
fy_addr = out_feature_start_addr;
for(fy=0; fy < fy_loop; fy++) { // loop for sliding window y
fx_addr = fy_addr;
fy_addr += fy_inc;
for(fx=0; fx < fx_loop; fx++) { // loop for sliding window x
c_addr = fx_addr;
fx_addr += fx_inc;
for(c=0; c < c_loop; c++) { // # of active systolic array column
out_addr = c_addr;
c_addr += c_inc;
write output data to out_addr;
} // # of active systolic array column (M dir), c
} // loop for sliding window x, fx
} // loop for sliding window y, fy
위와 같이 피쳐맵 메모리에 데이터를 배치하고 번지를 발생시켜 실행을 하면, 입력 피쳐맵도 앞의 번지부터 차례로 읽게 되고, 출력 피쳐맵도 제일 앞의 번지부터 차례로 발생되게 된다.
다만, K*K 웨이트를 입력 피쳐맵에 적용하는 과정에서 K*K 윈도우에 매핑되는 입력 피쳐맵의 입력 픽셀 그룹들을 사용하는데, 해당 과정에서 쓰기 주소 점프가 일어날 수 있으며, 쓰기 번지의 시작위치를 충분히 앞에 잡을 경우, 처리 과정에서 계산결과로 나오는 출력 피쳐맵 데이터가 사용될 입력은 건드리지 않으면서 이미 사용된 입력 피쳐맵 영역을 덮어 쓰면서 저장하는 것이 가능하다.
도 14는 본 발명의 실시예에 따른 입력 피쳐맵의 저장 공간을 출력 피쳐맵이 덮어쓰는 과정을 도시한다.
도 11 내지 도 13에서 설명한 과정을 통해, 본 발명의 실시예에 따르면, 입력 피쳐맵을 덮어 쓰면서 출력 피쳐맵을 저장할 수 있어, 주어진 온-칩 피쳐맵 메모리 공간을 더 효율적으로 쓸 수 있다.
이상에서 본 발명의 실시예에 대하여 상세하게 설명하였지만 본 발명의 권리범위는 이에 한정되는 것은 아니고 다음의 청구범위에서 정의하고 있는 본 발명의 기본 개념을 이용한 당업자의 여러 변형 및 개량 형태 또한 본 발명의 권리범위에 속하는 것이다.
Claims (20)
- 제1 레이어의 제1 웨이트 그룹을 저장하는 웨이트 메모리;
상기 제1 웨이트 그룹을 적용할 입력 피쳐맵을 저장하는 피쳐맵 메모리;
상기 제1 웨이트 그룹의 크기에 기반하여 상기 입력 피쳐맵의 제1 입력 픽셀의 제1 위치로부터 이격된 제2 위치를 결정하고, 상기 제2 위치에 인접하는 복수의 인접 픽셀을 결정하는 주소 발생기; 및
상기 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 제1 위치에 대응되는 제1 출력 픽셀을 획득하는 프로세서를 포함하는
CNN(Convolutional Neural Network) 처리 장치. - 제1항에 있어서,
상기 프로세서는 상기 제1 출력 피쳐맵에 상기 제1 레이어의 다음 레이어인 제2 레이어의 제2 웨이트 그룹을 적용하여 최종 출력 피쳐맵을 생성하고,
상기 주소 발생기는 외부 메모리로부터 상기 입력 피쳐맵을 로드하고, 상기 최종 출력 피쳐맵을 상기 외부 메모리로 전송하는
CNN 처리 장치. - 제2항에 있어서,
상기 주소 발생기는 상기 입력 피쳐맵 및 상기 입력 피쳐맵에 포함된 복수의 입력 픽셀들의 주소 정보를 획득하고, 상기 복수의 입력 픽셀들의 주소 정보 중 상기 제1 위치의 주소 정보 및 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제2 위치를 결정하며, 상기 제2 위치를 상기 프로세서로 전송하는
CNN 처리 장치. - 제3항에 있어서,
상기 주소 발생기는 상기 복수의 인접 픽셀의 주소 정보를 획득하고, 상기 복수의 인접 픽셀의 주소 정보 및 상기 복수의 입력 픽셀들의 주소 정보를 비교한 결과에 기반하여 상기 복수의 인접 픽셀 중 일부를 패딩(padding)으로 설정하는
CNN 처리 장치. - 시스톨릭 어레이를 이용한 CNN(Convolutional Neural Network) 처리 방법에 있어서,
복수의 채널로 구성된 입력 피쳐맵을 메모리의 주소 공간에 로딩하는 단계;
N(N은 자연수)번째 채널의 M(M은 자연수)번째 입력 픽셀을 상기 주소 공간 중에서 N * (M-1)번째 주소에 로딩하는 단계; 및
N+1번째 채널의 M번째 입력 픽셀을 상기 주소 공간 중에서 (N+1) * (M-1)번째 주소에 로딩하는 단계를 포함하는
방법. - 제5항에 있어서,
상기 N번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 N * (M-1)번째 출력 픽셀을 획득하는 단계, 그리고
상기 N * (M-1)번째 출력 픽셀을 상기 N * (M-1)번째 주소에 저장하는 단계를 포함하는
방법. - 제6항에 있어서,
상기 N+1번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 (N+1) * (M-1)번째 출력 픽셀을 획득하는 단계, 그리고
상기 (N+1) * (M-1)번째 출력 픽셀을 상기 (N+1) * (M-1)번째 주소에 저장하는 단계를 포함하는
방법. - 제5항에 있어서,
상기 N번째 채널의 (M+1)번째 입력 픽셀을 상기 주소 공간 중에서 N * M번째 주소에 로딩하는 단계를 포함하는
방법. - 제8항에 있어서,
상기 N번째 채널의 (M+1)번째 입력 픽셀은 상기 N번째 채널의 M번째 입력 픽셀이 속한 컬럼의 다음 컬럼에 포함되는 픽셀인
방법. - 제9항에 있어서,
상기 N번째 채널의 M+1번째 입력 픽셀에 웨이트를 적용하여 N * M번째 출력 픽셀을 획득하는 단계, 그리고
상기 N * M번째 출력 픽셀을 상기 M * M번째 주소에 저장하는 단계를 포함하는
방법. - 피쳐맵 메모리;
제1 레이어의 제1 웨이트 그룹을 저장하는 웨이트 메모리;
복수의 입력 채널로 구성된 입력 피쳐맵에 상기 제1 웨이트 그룹을 적용하여 출력 피쳐맵을 생성하는 프로세서; 및
N번째 입력 채널의 M번째 입력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 N * (M-1)번째 주소에 로딩하며, (N+1)번째 입력 채널의 M번째 입력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 (N+1) * (M-1)번째 주소에 로딩하며, 상기 피쳐맵 메모리의 주소 공간 중 상기 입력 피쳐맵이 저장된 주소에 상기 출력 피쳐맵을 오버랩하여 저장하는 주소 발생기를 포함하는
CNN 처리 장치. - 제11항에 있어서,
상기 프로세서는 상기 N번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 N * (M-1)번째 출력 픽셀을 획득하고,
상기 주소 발생기는 상기 N * (M-1)번째 출력 픽셀을 상기 피쳐맵 메모리의 주소 공간 중에서 상기 N * (M-1)번째 주소에 저장하는
CNN 처리 장치. - 제12항에 있어서,
상기 프로세서는 상기 N+1번째 채널의 M번째 입력 픽셀에 웨이트를 적용하여 (N+1) * (M-1)번째 출력 픽셀을 획득하고,
상기 주소 발생기는 상기 (N+1) * (M-1)번째 출력 픽셀을 상기 (N+1) * (M-1)번째 주소에 저장하는
CNN 처리 장치. - 제11항에 있어서,
상기 주소 발생기는 상기 N번째 채널의 (M+1)번째 입력 픽셀을 상기 주소 공간 중에서 N * M번째 주소에 로딩하는
CNN 처리 장치. - 제14항에 있어서,
상기 N번째 채널의 (M+1)번째 입력 픽셀은 상기 N번째 채널의 M번째 입력 픽셀이 속한 컬럼의 다음 컬럼에 포함되는 픽셀인
CNN 처리 장치. - 제15항에 있어서,
상기 프로세서는 상기 N번째 채널의 M+1번째 입력 픽셀에 웨이트를 적용하여 N * M번째 출력 픽셀을 획득하고,
상기 주소 발생기는 상기 N * M번째 출력 픽셀을 상기 M * M번째 주소에 저장하는
CNN 처리 장치. - 제11항에 있어서,
상기 주소 발생기는 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제1 웨이트 그룹을 적용할 복수의 인접 픽셀을 결정하며,
상기 프로세서는 상기 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 N * (M-1)번째 주소에 매핑되는 제1 출력 픽셀을 획득하는
CNN 처리 장치. - 제17항에 있어서,
상기 프로세서는 상기 출력 피쳐맵에 상기 제1 레이어의 다음 레이어인 제2 레이어의 제2 웨이트 그룹을 적용하여 최종 출력 피쳐맵을 생성하고,
상기 주소 발생기는 외부 메모리로부터 상기 입력 피쳐맵을 로드하고, 상기 최종 출력 피쳐맵을 상기 외부 메모리로 전송하는
CNN 처리 장치. - 제18항에 있어서,
상기 주소 발생기는 상기 입력 피쳐맵 및 상기 입력 피쳐맵에 포함된 복수의 입력 픽셀들의 주소를 획득하고, 상기 복수의 입력 픽셀들의 주소 중 상기 N * (M-1)번째 주소 및 상기 제1 웨이트 그룹의 크기에 기반하여 상기 제1 웨이트 그룹을 적용할 변경된 위치를 결정하며, 상기 변경된 위치를 상기 프로세서로 전송하고,
상기 프로세서는 상기 변경된 위치에 인접한 복수의 인접 픽셀에 상기 제1 웨이트 그룹을 적용하여 상기 출력 피쳐맵을 생성하는
CNN 처리 장치. - 제19항에 있어서,
상기 주소 발생기는 상기 변경된 위치 및 상기 복수의 입력 픽셀들의 주소 정보를 비교한 결과에 기반하여 상기 복수의 인접 픽셀 중 일부를 패딩(padding)으로 설정하는
CNN 처리 장치.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/204,599 US20190164037A1 (en) | 2017-11-29 | 2018-11-29 | Apparatus for processing convolutional neural network using systolic array and method thereof |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
KR20170162172 | 2017-11-29 | ||
KR1020170162172 | 2017-11-29 |
Publications (2)
Publication Number | Publication Date |
---|---|
KR20190063393A true KR20190063393A (ko) | 2019-06-07 |
KR102589397B1 KR102589397B1 (ko) | 2023-10-18 |
Family
ID=66850312
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
KR1020180138456A KR102589397B1 (ko) | 2017-11-29 | 2018-11-12 | 시스톨릭 어레이를 이용한 cnn 처리 장치 및 방법 |
Country Status (1)
Country | Link |
---|---|
KR (1) | KR102589397B1 (ko) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112132274A (zh) * | 2020-09-22 | 2020-12-25 | 地平线(上海)人工智能技术有限公司 | 特征图全连接卷积方法、装置、可读存储介质及电子设备 |
WO2021010806A1 (ko) * | 2019-07-18 | 2021-01-21 | 에스케이텔레콤 주식회사 | 시스톨릭 어레이 장치 |
US11409694B2 (en) | 2019-07-31 | 2022-08-09 | Samsung Electronics Co., Ltd. | Processor element matrix performing maximum/average pooling operations |
US11436168B2 (en) | 2020-10-14 | 2022-09-06 | Samsung Electronics Co., Ltd. | Accelerator and electronic device including the same |
KR20220125117A (ko) * | 2021-03-04 | 2022-09-14 | 삼성전자주식회사 | 뉴럴 프로세서 |
US11847465B2 (en) | 2020-11-26 | 2023-12-19 | Electronics And Telecommunications Research Institute | Parallel processor, address generator of parallel processor, and electronic device including parallel processor |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170220524A1 (en) * | 2013-12-20 | 2017-08-03 | Intel Corporation | Processing device for performing convolution operations |
-
2018
- 2018-11-12 KR KR1020180138456A patent/KR102589397B1/ko active IP Right Grant
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170220524A1 (en) * | 2013-12-20 | 2017-08-03 | Intel Corporation | Processing device for performing convolution operations |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021010806A1 (ko) * | 2019-07-18 | 2021-01-21 | 에스케이텔레콤 주식회사 | 시스톨릭 어레이 장치 |
KR20210009896A (ko) * | 2019-07-18 | 2021-01-27 | 에스케이텔레콤 주식회사 | 시스톨릭 어레이 |
US12019582B2 (en) | 2019-07-18 | 2024-06-25 | Sapeon Korea Inc. | Systolic array device |
US11409694B2 (en) | 2019-07-31 | 2022-08-09 | Samsung Electronics Co., Ltd. | Processor element matrix performing maximum/average pooling operations |
CN112132274A (zh) * | 2020-09-22 | 2020-12-25 | 地平线(上海)人工智能技术有限公司 | 特征图全连接卷积方法、装置、可读存储介质及电子设备 |
CN112132274B (zh) * | 2020-09-22 | 2024-05-28 | 地平线(上海)人工智能技术有限公司 | 特征图全连接卷积方法、装置、可读存储介质及电子设备 |
US11436168B2 (en) | 2020-10-14 | 2022-09-06 | Samsung Electronics Co., Ltd. | Accelerator and electronic device including the same |
US11966344B2 (en) | 2020-10-14 | 2024-04-23 | Samsung Electronics Co., Ltd. | Accelerator and electronic device including the same |
US11847465B2 (en) | 2020-11-26 | 2023-12-19 | Electronics And Telecommunications Research Institute | Parallel processor, address generator of parallel processor, and electronic device including parallel processor |
KR20220125117A (ko) * | 2021-03-04 | 2022-09-14 | 삼성전자주식회사 | 뉴럴 프로세서 |
Also Published As
Publication number | Publication date |
---|---|
KR102589397B1 (ko) | 2023-10-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20190164037A1 (en) | Apparatus for processing convolutional neural network using systolic array and method thereof | |
KR20190063393A (ko) | 시스톨릭 어레이를 이용한 cnn 처리 장치 및 방법 | |
KR102261768B1 (ko) | 대안적인 루프 제한 | |
CN109656623B (zh) | 执行卷积运算操作的方法及装置、生成指令的方法及装置 | |
US11361051B1 (en) | Dynamic partitioning | |
CN107992943B (zh) | 接收输入数据的方法、介质和系统、硬件逻辑及制造方法 | |
CN109034373B (zh) | 卷积神经网络的并行处理器及处理方法 | |
CN111758107B (zh) | 用于基于硬件的池化的系统和方法 | |
US7937346B2 (en) | Calculation processing apparatus and method | |
CN106056529B (zh) | 一种对用于图片识别的卷积神经网络训练的方法与设备 | |
KR20180109619A (ko) | 컨볼루션 신경망 처리 방법 및 장치 | |
US20100088475A1 (en) | Data processing with a plurality of memory banks | |
US20210201120A1 (en) | Inference apparatus, convolution operation execution method, and program | |
CN101120325A (zh) | 通过将读出和取得功能分离来提高数据处理设备的存储单元的性能 | |
CN108573305A (zh) | 一种数据处理方法、设备及装置 | |
CN113032007B (zh) | 一种数据处理方法及装置 | |
TWI848184B (zh) | 記憶體模組以及用於在記憶體內進行計算的方法 | |
US11640444B2 (en) | Device and method for accelerating matrix multiply operations | |
CN112395092A (zh) | 数据处理方法及人工智能处理器 | |
KR20210014561A (ko) | 다수 컨벌루션 윈도우 중의 이미지 데이터를 추출하는 방법, 장치, 기기 및 컴퓨터 판독 가능한 저장매체 | |
US11620503B2 (en) | Neural network processing | |
EP3182375B1 (en) | Apparatus and method for performing fourier transform | |
CN112712457B (zh) | 数据处理方法以及人工智能处理器 | |
KR20200142200A (ko) | 신경망 연산 효율 증대를 위한 신경망 가속기 및 그의 동작 방법 | |
US9842573B2 (en) | Apparatus and method for gaussian filtering |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
E902 | Notification of reason for refusal | ||
E701 | Decision to grant or registration of patent right |