강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

유승재님의 프로필 이미지
유승재

작성한 질문수

설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)

[FPGA 22장] 프로젝트 Fully Connected Layer 설계 - 실습편

lab22_main.c 관련 문의

작성

·

342

1

안녕하세요,
 
lab22_main.c 코드를 보면 아래 첨부한 그림과 같이
BRAM0에 먼저 weight를 저장하고, 그 이후에 BRAM1에 input node 값을 저장하고 있습니다.
 
HW의 좋은 점 중 하나는 병렬적인 행동이 가능하다는 것인데, 아래와 같은 코드로 FPGA를 조종할 경우, BRAM0, BRAM1에 들어가는 값들이 순차적 (직렬적)으로 저장되기 때문에 HW의 이점을 충분히 살리지 못한 것으로 저는 생각이 됩니다.
 
1. 이는 SW로 HW를 control하는 과정에서 어쩔 수 없이 희생해야하는 것인지 궁금합니다.
 
2. 만약 그렇지 않다면, 위와 같이 값은 BRAM0, BRAM1에 각각 저장하는 과정에서 어떤 방향성으로 코드를 수정하면 병렬성을 얻을 수 있을지 궁금합니다.
 
감사합니다.
 

답변 1

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 :)

굉장히 훌륭한 질문입니다. 지금 저랑 이런 대화를 나눈다는 것 자체가 훌륭하시다 생각이 듭니다. 알고계신대로, 미완의 프로젝트이구요.

강의에서 이를 설명하고 예제를 완성시키려면 더 많은 시간과 지식이 필요할 것 입니다.

(미래의 맛비에게 토스하고..)

현재는 방향성을 제시해 드리겠습니다.

1. 이는 SW로 HW를 control하는 과정에서 어쩔 수 없이 희생해야하는 것인지 궁금합니다.
 
아닙니다.
 
 
2. 만약 그렇지 않다면, 위와 같이 값은 BRAM0, BRAM1에 각각 저장하는 과정에서 어떤 방향성으로 코드를 수정하면 병렬성을 얻을 수 있을지 궁금합니다.
 
 
들어가기 전에 아시다시피, 현재 AXI4-Lite 를 통한 BRAM 에 copy 하는 과정이, 엄청난 Performance Bottleneck 임으로, 제가 알려드리는 방법을 적용해도, Performance 의 큰 개선은 불가할 것 이라 생각합니다. (느린 Performance 에align 됩니다.) AXI4-Lite  에서 AXI4 로 변경하여 Data 를 Copy 하는 과정의 속도를 개선하는 것이 우선이다 생각합니다.
현재 HW architecture 에서는 다음 방법이 적절해 보입니다.
 

double (or tripple or 그 이상) buffering  (ping pong buffer 라고도 부릅니다.)

현재 lab22 에서는
BRAM 이 현재 두개가 하나의 set 라고 가정하면, 현재는 1개의 set 만 존재합니다. 
set 수를 늘립니다. set 수가 두개라고 가정하면 다음과 같은 그림 맥락에서,
 
phase 1. SW 가 buffer set 1을 점유하고, HW 가 buffer set 2 를 점유하고,
phase 2. SW 가 buffer set 2을 점유하고, HW 가 buffer set 1 를 점유하고,
 
이 phase 1,2 를 Sync 를 맞추시면서 반복 시키면 됩니다. buffer set 수를 늘린다면 ring cnt 로 buffer set index 를 선택하시면 됩니다.
SW 에서 thread 혹은 Interrupt handler 가 필요합니다. SW 의 1 thread 로는 해당 phase 1,2 과정을 control 할 수 없습니다.
 
 
copy와 flip - Double buffering의 2가지 기법
 
앞서 설명드린 부분만 적용하더라도 엄청난? 개선 효과를 보실겁니다. 
(Data loading 이 너무 critical... ㅠㅠ)
 
개인적으로, Data 를 어떻게 loading 할 것인가는 HW 가속기의 Performance 에 중요한 요소입니다. Core 설계보다 더 어렵다 라고 생각하구요.
 
지금은 작은 단위?로 Weight, Feature map 을 BRAM 에 담아두고 사용하지만, Architecture 를 수정하여, 이런 loading 과정을 줄일 수 도 있겠죠?
 
제가 알려드린 방법외에도 더 좋은 방법이 있을 수 있으니, 고민해보시고 이렇게 저렇게 해보세요.  
 
즐공하세요 :)
유승재님의 프로필 이미지
유승재

작성한 질문수

질문하기