# hardware

45개의 포스트

범용적인 NPU 만들기(12) - 곱셈기(4) - 아키텍처

이전의 간이로 설계하였던 곱셈기에서 제대로 된 설계로 바뀌면서 processing_element 모듈에 변화가 생겼다. multiplier가 input feature map과 weight들을 받아들여 partial product들을 생성한 후 adder tree들에 의해 합산이 진행되는 구조다. 중간에 pipelining을 위한 FF이 존재한다. set bound는 이전에 설명했던대로 데이터의 상한값을 정해 하위 비트를 어디까지 사용할지를 정하는 부분이다. 여러 clk cycle에 걸쳐 계산할 경우 이전의 output이 더해지는데 이때 bount_level에 따라 데이터에 수정이 필요하므로 마찬가지로 set bound를 걸쳐 adder tree로 입력된다. (preoutputb -> pre_output)

2023년 9월 11일
·
2개의 댓글
·
post-thumbnail

범용적인 NPU 만들기(11) - 곱셈기(3) - 이론(3) - Wallace Tree

https://github.com/thousrm/universalNPU-CNNaccelerator/releases/tag/0.1 첫 릴리즈 버전이 5일 전 출시되었다. 아직 Arithmetic Part만이 구현되어있다. 저번 포스팅을 올리고 한달 가까이 지났다. 그동안 첫 릴리즈 버전을 앞두고 이것저것 바쁘기도 했지만 사실 가장 큰 이유는 포스팅을 올리는게 귀찮아서였음을 인정하겠다. 포스팅 하나를 작성하는데 꽤 시간을 잡아먹다보니 연재하기가 솔직히 좀 부담스럽기는 하다. 그래도 일단 시작한 일인만큼 끝을 맺겠다. Wallace Tree는 여러개의 Partial Product들을 덧셈하는 방식 중의 하나다. Wallace Tree의 가장 큰 특징 중 하나는 stage를 나누어서 덧셈한다는 점이다.

2023년 9월 2일
·
0개의 댓글
·
post-thumbnail

Github Pages - 정적 사이트 만들기 1

Github Pages와 Jekyll의 관계 GitHub Pages는 정적 웹사이트 호스팅 서비스를 제공하는 플랫폼으로, GitHub 리포지토리에 있는 정적 파일들을 호스팅하여 웹사이트를 제공합니다. 이때 정적 파일은 HTML, CSS, JavaScript, 이미지 등과 같이 서버에서 추가적인 처리 없이 클라이언트 브라우저에서 직접 열람 가능한 파일들을 말합니다. Jekyll은 정적 사이트 생성기로서, 마크다운 파일과 템플릿을 사용하여 웹사이트의 구조와 콘텐츠를 정의하고, 이를 빌드하여 정적 HTML 파일로 변환해줍니다. Jekyll은 개발자들이 웹사이트의 디자인, 레이아웃, 콘텐츠 등을 관리하고 갱신할 때 도움을 주는 역할을 합니다. GitHub Pages에서 Jekyll을 사용하면 빌드된 정적 HTML 파일들을 호스팅하여 웹사이트를 구동하게 됩니다. 즉, 지킬은 빌드 시 정적 파일을 생성해주고, 깃허브 페이지는 생성된 정적 파일을 실제로 웹 사이트로 들어가서 볼 수 있도록

2023년 8월 21일
·
0개의 댓글
·
post-thumbnail

범용적인 NPU 만들기(10) - 곱셈기(2) - 이론(2) - Modified Booth Algorithm

오늘은 중요한 알고리즘인 Modified Booth Algorithm(이하 MBA)에 대해 설명할 예정이다. 현재 설계하는 곱셈기는 MBA + Wallace tree 방식으로 설계할 예정이다. wallace tree에 대해서는 다음 포스팅에서 다루겠다. 간단하게 요약하면 MBA는 곱셈할 때 partial product의 수 (즉, row의 수)를 줄여서 곱셈을 간단하게 하는 방법이다. 이는 곱셈기의 성능, 면적 등에 크게 영향을 미치는데 그 이유는 다음과 같다. 일반적으로 곱셈은 2단계로 이루어지는데 바로 partial product 생성 -> partial product 덧셈이다. 여기서 첫단계인 partial product 생성은 오래 걸리지 않는다. 사람이 계산을 할 때도 각 partial product를 생성하는데는 오래 걸리지 않는데 특히 컴퓨터의 경우 완전히 병렬로 수행할 수 있기에 더욱 그렇다. ![](https://velog.velcdn.com/image

2023년 8월 8일
·
0개의 댓글
·
post-thumbnail

범용적인 NPU 만들기(9) - 곱셈기(1) - 이론(1) - signed multiplication

이전 포스팅을 작성한지 상당한 시간이 지났다. 지난 포스팅에서 processing core의 설계가 끝나 그동안 곱셈기에 대해 공부하고 아키텍처를 설계하고 있었다. 이전에 말했듯이 효율적인 곱셈기+덧셈기를 설계하는 것은 그 자체로 하나의 프로젝트라 할 수 있는 정도라 준비하는데 조금 시간이 걸렸다. 지금 어느 정도 설계가 끝나 우선 필요한 이론에 대한 포스팅을 올리려한다. 하드웨어 설계와 관련된 강의를 수강해본 사람은 그냥 곱셈기를 설계하는데 따로 필요한 이론이랄게 있나? full adder를 2차원으로 배열하면 되는데하는 의문이 들 수도 있다. 실제로 내가 수업 중에 설계했었던 unsigned carry save multiplier는 구조가 복잡할게 없다. 이론도 필요없다. 아주 간단하게 설계가능하다. 하지만 만들어야하는건 그냥 곱셈기가 아니라 효율적인 signed 곱셈기이기에 설계에 들어가기에 앞서 몇가지 배워야할 것들이 있다. 이번 포스팅에서는 먼저 signe

2023년 8월 3일
·
2개의 댓글
·
post-thumbnail

범용적인 NPU 만들기(8) - 코드 및 설명 - Relu, maxpooling

Relu는 애초에 매우 간단한 구조라 이전에 설명했던 것과 동일한데 maxpooling은 이전에 생략한게 좀 있었고 또 중간중간 수정한 부분이 있어 설명이 필요하다. Relu Relu 모듈은 추후 BN 기능을 추가할 예정이나 아직 곱셈기를 설계하지 못했기 때문에 일단은 Relu 기능만을 수행하는 상태로 두었다. maxpooling maxpooling은 전체적인 구조는 변하지 않았지만 몇가지 부분이 추가되었다. 컨트롤을 위한 wire들이 많아서 이해하기 어려울 수 있다. 설명이 불필요한 몇몇 중간 wir

2023년 7월 23일
·
2개의 댓글
·

범용적인 NPU 만들기(7) - 코드 및 설명 - processing_element(2)

내 생각에 하드웨어 디자인에서 오류가 나는 대부분의 경우는 timing 문제인 것 같다. 내가 아직 간단한 모듈들만을 디자인해봐서 그런걸지도 모르지만 개개의 세부 부분들이 기능적으로 잘못 작동하는 경우는 거의 없었고 있더라도 수정하기 쉬웠다. 자꾸 오류가 나서 디버깅을 할 의욕을 잃게 하는 대부분의 문제는 timing 문제였다. 이번에 깨달은 점은 실제 코드 작성에 들어가기전에 timing 그래프 등을 그려가며 아키텍처를 미리 상세하게 설계하는 것이 매우 중요하다는 것이었다. 사실 나는 무언가를 하기전에 상세하게 계획을 짜는 것을 그다지 좋아하지 않는다. 그래서 하드웨어 설계를 할 때도 전반적인 구조만 구상했을뿐 세부 모듈들의 구조까지 사전에 미리 상세하게 설계하고 코드작성에 들어가지는 않았다. 문제가 생기면 그때 고치면 되지하는 생각으로 그동안 해왔었다. 그런데 이번에 복습겸, 포스팅겸 미리 아키텍처와 timing 그래프를 비교적 상세하게 그리고 작업하면서 느낀게 이 과정을

2023년 7월 21일
·
2개의 댓글
·
post-thumbnail

범용적인 NPU 개발기(6) - 코드 및 설명(2) - processing_element(1)

친구의 조언을 받아들여 깃허브를 만들었다. https://github.com/thousrm/universalNPU-CNNaccelerator/tree/main 버전 관리에 용이해보여 적극적으로 이용할 생각이다. 모듈의 이름을 직관적이지 못하게 지었는데 사실 기능을 생각하면 convolution processor나 그 비슷한게 더 낫다. 또 convolution만 수행하는게 아니라 이후의 후처리 과정에서 몇가지 다른 연산을 수행하기도 하기에 다시 여러개의 세부 모듈로 분할하는게 맞지만... 코드가 별로 길지도 않은데 포트 일일이 또 잡아주기 귀찮아서 그냥 한번에 작성했다... 귀찮은게 문제다 항상 processing element 만이 아니라 다른 모듈들도 always 문을 잘 안쓰고 assign을 주로 사용해서 작성했는데 그 이유는 개인적으로 assign 문이 데이터 흐름을 파악하는데 더 좋기도 하고 혹시 synthesis 할 때 레지스터로 되는 것을 막기위해 가능한 a

2023년 7월 18일
·
2개의 댓글
·

범용적인 NPU 개발기(5) - 코드 및 설명(1) - arithmetic_core

코드 작성하고 디버깅하느라 이전 포스팅을 올리고 많은 시간이 지났다. 현재 코드 작성을 완료하고 테스트벤치 등을 통해 functionality check를 끝낸 상태인데 본래라면 synthesis를 하고 그 결과에 따라 더 최적화를 진행하겠지만 아쉽게도 나는 더이상 재학생이 아니라 학교의 synthesis 툴을 사용할 수 없다... 그리하여 기본적인 아키텍처에 대한 코드 작성을 여기서 완료하고 이후에는 곱셈기+덧셈기의 상세 설계를 수행할 예정이다. 물론 현재 작성한 기본 아키텍처의 코드를 올리고 설명하는 것이 선행될 것이다. 현재 구상하는 NPU의 계층 구조는 다음과 같은데 NPU 안에 control part, arithmatic part, memory part가 존재하고 현재 구현한 부분은 이 중에서 ari

2023년 7월 16일
·
0개의 댓글
·
post-thumbnail

범용적인 NPU 개발기(4) - 아키텍처(3) - Relu, maxpooling

NPU의 연산부는 convolution, Relu, maxlooling을 수행할 수 있어야한다. 이전 포스팅에서 convolution을 다루는 부분을 설명했으니 다음은 Relu와 maxpooling을 수행하는 모듈에 대해 설명해보자. 두 모듈은 convolution을 수행하는 모듈에 비해 매우 간단하다. Relu 모듈 간단하게 Relu_en과 input[7]이 둘 다 1인 경우에만 무조건 0을 출력하고 그외의 경우에는 input[n]이 그대로 output[n]으로 출력되게 하면 된다. Relu_en은 Relu 기능을 사용할지 말지를

2023년 7월 3일
·
0개의 댓글
·
post-thumbnail

범용적인 NPU 개발기(3) - 아키텍처(2) - convolution

내가 생각한 convolution layer를 수행하기 위한 아키텍처는 2가지가 있는데 한가지는 구현이 쉽지만 효율이 떨어질 것으로 예상되는 것이고 다른 하나는 효율이 좋지만 구현이 어려울 것으로 예상되는 구조이다. 후자는 코드 작성에 들어가기에 몇가지 문제점이 남아있어서 이번에는 일단 전자의 방법을 채택해 NPU를 구현하기로 결정했다. 이번 포스팅에선 전자만 설명하고 후자는 나중에 다른 포스팅에서 설명하겠다. input 데이터의 컨트롤 등은 해당 모듈이 아닌 npu 내에 존재하는 다른 모듈에서 수행할 예정이므로 해당 모듈은 input이 알맞게 들어오는 것을 가정하고 만들어졌음을 유의해주길 바란다. 첫번째 방법은 adder tree 방식을 응용한 아키텍처로 기존의 adder tree 방식에 D_FlipFlop과 8bit adder를 1개씩 추가한 아주 간단한 방법이다. ![](https://velog.velcdn.com/images/hyal/post/c66d280e-

2023년 7월 2일
·
0개의 댓글
·

범용적인 NPU 개발기(2) - 아키텍처(1)

일단 기존의 CNN 가속기 아키텍처 2가지를 알아보자 각각 systolic array 방식과 adder tree 방식인데 먼저 systolic array 방식부터 알아보자 > Inayat K, Chung J. Carry-Propagation-Adder-Factored Gemmini Systolic Array for Machine Learning Acceleration. Electronics. 2021; 10(6):652. https://doi.org/10.3390/electronics10060652 위 그림에서 (a) 그림이 systolic array 방식이다. (b)는 이를 조금 변형한건데 오늘 다룰 내용과는 상관없으니 무시해도 좋고 내부 PE 구조는 어떻게 설계하느냐에 따라 다르니 그에 대한 내용도 무시해도

2023년 7월 1일
·
0개의 댓글
·

범용적인 NPU 개발기(1) - 설계계획(1)

일단 핵심적인 부분부터 구현하고 그외의 곁가지 부분이나 추가적인 기능을 추가할 것으로 계획했기 때문에 우선적으로 구현할 부분과 추후에 추가할 부분으로 나누어져 있다. > - 목적 범용적인 CNN 가속기 input의 크기에 상관없이 convolution을 수행할 수 있을 것 weight의 개수에 상관없이 convolution을 수행할 수 있을 것 maxpooling을 수행할 수 있을 것 Relu를 수행할 수 있을 것 우선 구현할 기능 연산유닛 quantization 된 8비트 integer인 input, weight, bias에 대한 convolution 수행 여러가지 필터를 가진 convolution의 효율적인 수행 명령에 따라 convolution만 혹은 maxpooling만, convolution -> maxpooling, convolution -> relu, convolution -> r

2023년 6월 28일
·
0개의 댓글
·

범용적인 NPU 개발기(0) - 들어가기 앞서

깃허브 링크: https://github.com/thousrm/universalNPU-CNNaccelerator 상반기 구직에 실패하고 붕 뜬 시기. 무엇을 할까 고민하던 중 마침 이전에 제대로 끝마치지 못했던 NPU, 정확히는 범용적인 CNN 가속기를 제대로 설계해볼까 하는 마음이 들었다. 본래 공모전으로 수행했던 프로젝트였는데 중간에 팀원에게 개인적인 사정이 생겨 결국 마감까지 설계를 끝마치지 못하고 미완성으로 남았던 일이었다. 사실 미완성했다는 아쉬움도 아쉬움이지만 지금 돌아보면 정말로 그때는 베릴로그를 엉망진창으로 작성했었다는걸 알 수 있기에 이번에 한번 제대로 CNN 가속기를 설계해보았으면 하는 마음이 들었다. 그때 공모전은 FPGA에 올리는 것을 전제로 진행되었는데 어차피 자체적으로 하는 프로젝트기에 굳이 FPGA에 올리는 것을 전제로 하기보다는 여러 스마트폰이나 시스템에 탑재된다고 가정하고 설계해보려 한다. 일지를 작성하는 이유는 요즘 작년에 했던 일도

2023년 6월 27일
·
0개의 댓글
·
post-thumbnail

복습

하드웨어 구성과 특징 컴퓨터 하드웨어 CPU, 메모리(기억장치), 주변장치로 구성 시스템 버스로 연결되어 있음 1. CPU 모든 장치의 동작을 제어하고 연산 수행 레지스터 + 연산장치 + 제어장치 (노란색 밑줄: 데이터 부분 / 파란색 밑줄: 제어 부분) 레지스터 가시 레지스터: 정보 변경 가능 데이터 레지스터 (DR, Data Register) 주소 레지스터 (AR, Address Register) 불가시 레지스터: **정

2023년 6월 25일
·
0개의 댓글
·
post-thumbnail

[수업 정리] 1. 컴퓨터 시스템

컴퓨터 및 프로그래밍 입문이라는 컴공 1학년 강의이다. 작년에 C 원어 강의를 들었는데, 그곳에서 좋은 친구를 만났다. 아르헨티나 출신 스페인 교환학생인데 같이 공부도 했고, 재미있게 놀았다. 월드컵 우승했을 때 감동은 아직도 눈물 한 방울 찔끔 흘리게 한다. 그 친구는 올해 초 돌아갔고, 나는 외국인 친구 좀 더 만나고 싶어서 또 원어 강의 신청했다ㅋㅋ 복수전공하는 동아리 후배 친구랑 같이 수업을 듣는데, 이번 학기엔 외국인 친구보단 다른 인연이 있을듯 싶다. 수업 정리는 인상 깊었던 내용 위주로 정리할 예정이다. 컴퓨터와 계산기의 차이점? 공학용 계산기 말고 일반 계산기를 생각해보자 계산기는 보통 숫자 하나씩 입력한다. 이런 식으로 말이다. 입력하는 순서에 따라 계산 결

2023년 3월 27일
·
0개의 댓글
·
post-thumbnail

GPU에서 첫 실행 시 일정 시간 대기 발생하는 이유

TL;DR Q: GPU로 실행 시 초기 대기가 왜 발생하는가? A: CUDA 런타임이 런타임 함수가 처음 실행되었을 때 초기화되고, 초기화 과정에 호스트의 프로세스와 유사한 CUDA context, DLL과 유사한 CUDA module을 초기화하는 과정이 포함되어있기 때문에 초기 대기가 발생할 수 있다. Content https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#cuda-general-purpose-parallel-computing-architecture > The CUDA parallel programming model is designed to overcome this challenge while maintaining a low learning curve for programmers familiar with standard programming languages such as C. > At

2023년 2월 6일
·
0개의 댓글
·
post-thumbnail

컴알못을 위한 컴퓨터의 4가지 핵심 부품

Intro 프로그래밍을 아는 것도 중요하지만, 그 전에 컴퓨터가 무엇인지에 대해 아는 것이 더 중요할 것 같았다. 기초를 공부하기 전 그 기초를 동작하게 만드는 Super 기초를 공부하는 느낌이랄까... 😎 사실 그것보다는 위 사진처럼 컴퓨터를 뜯어보면 나오는 괴기한 기계 장치들을 이해하고 싶었다. 어릴 적부터 컴퓨터를 하며 저런 부품들을 직간접적으로 봐왔는데, 이제는 저것들을 이해할 필요가 있지 않을까 싶은 생각!? 그래서 공부하게 된 컴퓨터의 네 가지 핵심 부품! 컴알못도 이해하기 쉽게 정리해보고자 한다! > 여담으로 공부하고 나서 알게 된 사실인데, 컴퓨터가 고장났을 때 메인보드만 교체해줬던 기사님이 갑자기 미워졌다ㅠㅠ 사실 문제는 메인보드가 아니었는데... 나는 그 메인보드가 뭔지 몰라서 비싼 돈을 내고 정작 컴퓨터도 고치치 못했다 😭 컴퓨터의 4가지 핵심 부품 1. 중앙처리장치 (CPU) - 컴퓨터의 두뇌 🧠 CPU는 쉽게 말해 컴퓨터의

2022년 9월 22일
·
0개의 댓글
·
post-thumbnail

linux/ 하드º소프트웨어 정보 확인

대소문자 구분 없이 시리얼을 포함한 단어 정보 출력 cpu 정보 확인 processor : 프로세서의 번호를 의미하며, 수만큼 결과의 수가 출력됨. model name : cpu 모델 명 physical id : 실제 물리적 cpu의 수를 의미 siblings : thread의 존재 여부를 확인 → cpu cores == siblings : hyperthread 불가능 hyperthread : 물리코어 1개를 논리적으로 코어 2개처럼 사용

2022년 9월 14일
·
0개의 댓글
·
post-thumbnail

인터넷은 어떻게 작동하나요?

http://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htm ©2002 Rus Shuler @Pomeroy IT Solutions, 판권 소유 1. 소개 인터넷을 작동시키는 기본 인프라와 기술에 대해 설명합니다. 깊이 있게 다루지는 않지만 관련된 개념에 대한 기본적인 이해를 돕기 위해 각 영역을 충분히 다룹니다. 답이 없는 질문에 대해서는 문서 끝에 리소스 목록이 제공됩니다. 모든 의견, 제안, 질문 등은 권장되며 작성자에게 rshuler@gobcg.com으로 보낼 수 있습니다. 2. 어디서부터 시작해야 할까요? 인터넷 주소 인터넷은 컴퓨터의 글로벌 네트워크이기 때문에 인터넷에 연결된 각 컴퓨터 에는 고유한 주소가 있어야 합니다 . 인터넷 주소는 nnn.nnn.nnn.nnn 형식입니다 . 여기서 nnn은 0 - 255 사이의 숫자여야 합니다. 이

2022년 9월 2일
·
0개의 댓글
·