오늘의 학습 내용(4/18/2025)...

verilog 실습:

computer architecture:

오늘 본 책들:

잡용어/앱들:

잡소리 적어보기:

경험적으로 보면 프로그램을 모두 내손으로 작성한다기 보단 일련의 함수들과 type/template을 정의해서 일반적인 컴퓨터 언어의 형태로 구현하고, 각각의 함수들에서 실질적으로 일어나는 일들을 IR의 형태로 기록하고, 그 결과를 가지고 optimize/code generation을 하는 것이 내가 보기엔 빠른 approach로 보여진다.
다시 말해서 언어를 정의해서 parsing하고 syntax/semantic을 파악해서 맞는지 틀린지 찾아내고 하는 것은 내가 봤을 때, 매우 귀찮은 작업으로 보여진다.
이를테면 내가 정의한 함수가 있고, 그것이 정해진 일을 하는데, 이를테면 단순히 + operator를 썼지만 vector나 matrix/tensor의 합을 계산하도록 되어있다면, 예상되는 결과를 출력시켜서 reference로 삼게 하고, 이때 이루어지는 low level 연산작업들을 주어진 규칙에 따라 모두 기록하게 되면, 사실상 이것은 내가 정의한 언어로 프로그램을 작성한 것이나 다를 바가 없다. 이것을 IR로 놓으면 나머지는 target H/W에 최적화하는 작업만 남게 된다.

이와 관련하여 검색해보면 다음의 프로젝트들이 걸린다. 그러니까 이것들은 초반기의 lexer/syntactic/sementic analysis 단계가 빠진, DSL(domain specific language)의 형태로 구현된 프로그램에서 생성한 IR을 가지고 backend (optimize/code generation)을 하게 된다.

이들 IR이 특별히 CUDA라든가 그 외의 GPU에 쓰이게 될 최종 코드가 뛰어난 성능을 발휘하게 한다는 것 보단 일종의 학술적/실험적인 연구라고 봐야지 싶다. LLVM을 쓰더라도 아직 사람이 최적화해놓은 라이브러리에 당하진 못한다. MLIR의 경우는 여러 번의 lowering을 통해서 Triton(NVIDIA)이라든가 업체별 backend processor를 통해서 최종적인 코드를 얻기는 했었다고 한다.

MLIR:
논문 읽기.