반도체 설계의 선봉에 서는 개척자
<면책조항>
이 시리즈 글에서 발행하는 내용은 개인적인 사견이며 내가 거쳐온 전현직 회사의 의견을 대표하지 않는다. 또한 해당 회사들에서 접했던 어떠한 기술적인 내용, 대외비에 해당하는 사항을 일절 포함하지 않는다.
미국의 한 시스템 반도체 기업에서 GPU 아키텍트로 일하고 있다. 가끔 한국의 공학도, 현업자들로부터 '아키텍트는 정확히 무슨 일을 하나요?'와 같은 질문을 받곤 한다. 사실 이 질문은 당연한 궁금증에서 비롯된 것일 것이다. 회로 설계, 테스트, 검증 엔지니어같은 직군은 이름만 들어도 대략적인 업무가 떠오르지만, '아키텍트'라는 단어는 직관적으로 이해하기 어렵다. 특히 한국 반도체 회사에서 '아키텍트'라는 직군이 흔하지 않아서 이 일을 하는 사람을 직접 만나 이야기를 들어볼 기회도 많지 않을 것이다.
그래서 이 글을 쓰게 되었다. 아키텍트라는 직군에 관심 있는 이들이 조금이라도 더 이해할 수 있도록, 내 경험과 지식을 바탕으로 설명하려 한다. 이 시리즈는 총 3편으로 구성될 예정이다:
1. 아키텍트란 어떤 직무인가
2. 아키텍트가 되기 위해 어떤 역량과 경력이 필요한가
3. 나는 어떻게 아키텍트가 되었는가
이 글이 여러분께 도움이 되기를 바란다.
간단히 말하면, '아키텍트(Architect)는 아키텍처(Architecture)를 설계하는 사람'이다. 그렇다면 아키텍처는 무엇일까? 우선 사전적인 정의를 살펴보자.
옥스퍼드 사전에 따르면 아키텍처의 첫 번째 정의는 '건축'이다. 특정 시대나 장소의 문화를 반영하는 건물 양식을 가리키기도 한다. 이런 의미에서 건축공학 자체가 Architectural Engineering이라고 부르는 것도 자연스럽다. 그런데 이 정의가 반도체와 무슨 관계가 있을까? 놀랍게도, 반도체 설계와 건물 짓는 과정은 꽤 비슷하다. 그래서 아키텍처의 두 번째 정의가 중요하다: '복잡하고 세심하게 설계된 일련의 구조'. 특히 '컴퓨터 또는 컴퓨터 기반 시스템의 개념적인 구성과 논리적인 구조'라고 설명이 반도체 설계와 맞닿아 있다.
여기서 '컴퓨터'라는 것은 우리가 알고 있는 데스크톱이나 노트북뿐 아니라 '연산'과 '저장'을 수행하는 모든 장치를 의미한다. CPU, 메모리, GPU 같은 하드웨어뿐만 아니라, 이 위에서 구동되는 소프트웨어에도 각각의 아키텍처가 존재한다.
이렇듯 아키텍처는 매우 폭넓으면서 추상적인 개념이다. 다양한 분야에서 사용되는 아키텍처를 일반화시킨 정의이기 때문이다. 따라서 이를 구체화시켜 이해하려면 앞에 붙는 단어를 함께 살펴보아야 한다.
시스템 아키텍처
소프트웨어 아키텍처
하드웨어 아키텍처
CPU 아키텍처
GPU 아키텍처
메모리 아키텍처
따라서 위의 정의에 따라 GPU 아키텍처는 'GPU의 개념적인 구성과 논리적인 구조'가 될 것이고, 소프트웨어 아키텍처라고 했을 때는 '특정 소프트웨어의 개념적인 구성과 논리적인 구조'가 될 것이다.
아키텍트는 제품과 서비스의 '개념적인 구성과 논리적인 구조'를 설계하는 사람이다. 이를 업계에서는 '아키텍처링(Architecturing)'이라고 부르기도 하는데, 이 아키텍처링은 '설계(Designing)'의 한 부분으로 이해할 수 있다. 설계는 아키텍처를 포함해 더 구체인 작업(예. RTL 구현)까지 포함하는 개념이다.
그렇다면 '개념적인 구성과 논리적인 구조'는 과연 무엇일까? 이를 쉽게 설명하기 위해 사례를 들어보겠다. 내가 소프트웨어 엔지니어 인터뷰를 보고 있다고 가정해 보자. 실리콘밸리에서 경력직 소프트웨어 엔지니어가 인터뷰를 볼 때, 문제 풀이식 코딩과 더불어 함께 치르는 것이 바로 '시스템 디자인'이다. 예를 들어, 소셜 미디어 빅테크에 입사 지원을 한다면, "사용자가 친구와 팔로우한 사람들의 활동을 볼 수 있는 뉴스 피드 시스템을 설계하세요"라는 문제를 받을 수 있다. 이때 지원자는 출제자와 활발히 논의하면서, 몇 단계를 통해 거쳐 해당 시스템을 설계해야 한다.
1단계: 요구사항을 파악한다. 우선 어떤 기능이 필요한지 결정해야 한다.
사용자가 친구의 활동을 시간순으로 볼 수 있는가?
텍스트 게시글, 이미지, 동영상도 포함해야 하는가?
좋아요 및 댓글은 어떻게 보여줄 것인가?
실시간으로 뉴스 피드가 갱신되어야 하는가?
또한 이런 기능적인 측면 외에, 확장성, 지연시간과 같은 성능 요구 사항도 정의해야 한다.
2단계: 시스템의 큰 그림 그린다. 요구사항을 지원하기 위해서 시스템의 주요 모듈을 정의한다.
사용자 프로필과 목록을 관리할 모듈
친구의 활동 기록을 저장할 로깅 모듈
친구의 활동을 수집하고 시간순으로 정렬할 뉴스 피드 생성 모듈
로그와 사용자 데이터를 저장할 저장소 모듈
지연시간을 최소화하기 위해 캐싱하는 모듈
3단계: 세부 사항 설계한다. 정의된 주요 모듈이 목적대로 기능하기 위해서, 모듈별로 세부적인 항목들을 정의한다. 위 예에서 사용자 프로필이라면, ID, 이름, 프로필 사진, 친구 목록 등이 포함되고, 사용자 활동이면 활동의 종류(텍스트, 이미지 등), 시간(타임스탬프), 사용자 ID가 포함된다. 데이터 저장소라면 어떤 DB를 사용할 것인지, 사용자 프로필과 활동 DB를 어떻게 저장할 것인지를 정의한다. 각 모듈의 세부 사항이 결정되면 모듈간 데이터 흐름과 방식등도 함께 정의한다.
4단계: 성능 최적화를 위한 전략을 수립한다. 모듈 및 데이터 흐름 정의가 완료되면, 주요 모듈에서의 최적화 알고리즘을 구상한다. 위의 예라면, 뉴스 피드를 생성하는 모듈에서 두 가지 방법을 고려해 볼 수 있다.
사용자가 활동을 하면, 친구들의 뉴스 피드에 즉시 업데이트 된다.
사용자가 뉴스 피드를 요청하면, 친구들의 최신 활동을 검색해 가져온다.
이 두가지 방법에 대해 속도, 메모리 용량 측면에서 장단점이 존재한다. 이러한 상충관계를 해결하기 위해 고민하다보면 절충 방안을 도출할 수도 있을 것이다. 또한 이 단계에서 캐싱을 하기 위한 방안이나, 확장성을 위해 트래픽을 분산하는 알고리즘들도 함께 설계하게 될 것이다.
5단계: 샘플 다이어그램으로 도시화한다. 지금까지 논의된 사항을 바탕으로, 주요 모듈 및 내부 요소를 도시화하고 각 모듈 간 통신 관계를 다이어그램으로 그린다. 또한 데이터 흐름 측면에서 클라이언트 → API 서버 → 데이터베이스 → 캐시로 이어지는 순서도도 함께 표현한다.
이러한 단계를 통하면 '뉴스 피드 시스템' 소프트웨어의 '개념적 구성과 논리적 구조'가 완성될 것이다. 즉 1) '뉴스 피딩'이라는 목적을 달성하기 위해 정의한 다양한 세부 기능(피드의 시간순 정렬)이 '개념적 구성'이 될 것이며, 2) 이 기능을 완성하기 위해 정의한 모듈(사용자 프로필, 활동, 로깅, 피드 생성, 저장소)과 세부 요소의 연관 관계, 그리고 최적화 전략이 '논리적 구조'가 될 것이다. 그리고 프로그래밍 언어로 실제로 소프트웨어를 구현하기 전에, 이렇게 정의하는 상위 수준의 구성과 구조가 바로 '소프트웨어 아키텍처'가 된다.
재미있는 것은 시스템 반도체가 될 하드웨어 아키텍처를 설계하는 과정도 이와 크게 다르지 않다는 것이다. 하드웨어 아키텍처를 설계할 때에도 새롭게 지원해야 할 API 표준이나 자체적으로 고안한 새로운 기능을 정의하고(1단계: 요구사항을 파악한다), 목적 기능을 지원하기 위한 주요 하드웨어 모듈을 구상한 뒤(2단계: 시스템의 큰 그림 그린다), 각 모듈에서 처리할 데이터, 모듈 간 인터페이스를 정의한다(3단계: 세부 사항 설계한다). 그리고 성능, 비용, 전력 소모측면에서 효율을 극대화하기 위해 주요 모듈에서의 최적의 처리 방식을 고안한다(4단계: 성능 최적화를 위한 전략을 수립한다).
고안된 여러 방안을 '모델'이라고 한다. 여러 후보들중 가장 좋은 모델을 선택하기 위해서 수행하는 것이 바로 '실험'이다. 실험을 위해 아키텍트는 '시뮬레이터'라 불리는 별도의 소프트웨어를 이용하거나 필요시 구현한다. 시뮬레이터는 하드웨어의 동작 방식을 '거의' 유사하게 따르며 실행해, 실제 하드웨어로 구현되었을 시 어떠한 성능을 보여줄지를 예측해 준다.
아키텍트는 이러한 실험과정에서 다양한 모델을 시뮬레이션해 비교 분석하며 가장 최적의 모델을 찾아 나간다. 이를 아키텍처 탐색(Exploration)이라고 한다. 그리고 그 최종 모델이 도출되면, 이를 아키텍처 스펙으로 문서화한다(5단계: 샘플 다이어그램으로 도시화한다). 스펙은 설계한 하드웨어의 모듈별 다이어그램, 원리, 동작 방식, 데이터 흐름, 인터페이스, 지표 마다의 목표 성능 등을 자세히 기술한다. 회로 설계 엔지니어들이 이 스펙을 읽고 실제 하드웨어로 구현할 수 있을 정도로 구체적이어야 한다.
물론 하드웨어 아키텍트에게는 저수준 하드웨어에 대한 지식이 더 필요하다. 모듈을 정의할 때부터 하드웨어 파이프라인, 캐시 및 메모리 계층, 프로세서 구조, 병렬화 등과 같은 다양한 하드웨어 개념을 고려해야 하기 때문이다. 하지만 앞에서 보았듯 '하드웨어 아키텍처를 설계'는 근본적으로 소프트웨어 시스템을 설계하는 과정과 거의 유사하다. 따라서 아키텍트를 달리 표현하자면 '하드웨어 알고리즘을 설계하는 사람'이라고 해도 무방하다. 그래서 좋은 아키텍트는 하드웨어 동작 방식에 익숙할 뿐만 아니라 소프트웨어와 알고리즘적인 사고에 능해야 한다. 제한된 자원으로 최적의 성능을 도출하면서, 문제 해결 방안을 고안하는 과정이 바로 '알고리즘'이기 때문이다.
아키텍트는 시스템 반도체 설계의 시작을 책임지는 건축가와도 같다. 시스템 반도체를 완성하는 과정이 집을 짓는 것에 비유할 수 있기 때문이다. 건축가는 고객으로부터 요구사항을 듣고, 고객의 예산 내에서 최상의 건물 구조를 설계한다. CAD를 통해 가상으로 집을 세워보고 3차원으로 외양을 점춰보듯이, 하드웨어 아키텍트는 시뮬레이터를 통해 구현될 시스템 반도체의 주요 지표(성능, 전력, 면적) 등을 미리 예측한다. 건축가가 설계도를 그리듯 하드웨어 아키텍트는 스펙을 쓴다.
건축가의 손길이 집 짓기의 시작인 것처럼, 하드웨어 아키텍트는 반도체 설계의 최전단(最前端)을 맡는다. 그래서 이들은 반도체 설계의 선봉에 서는 개척자다. 반도체 설계부터 생산까지 이어지는 단계를 아우를, 최초의 레퍼런스를 만들어내기 때문이다.
다음 글에서는 아키텍트가 되기 위해 어떠한 역량과 경력이 필요한지 살펴보도록 하겠다.
- 예나빠
표지 이미지: Book Cover of 'The Art of Hardware Architecture: Design Methods and Techniques for Digital Circuits' Springer 2012
엔지니어 커리어에 관해 질문있으시면 언제든 아래 글에 댓글 남겨주시기 바랍니다.
예나빠 브런치 북/매거진 소개
자기계발/정보전달/칼럼
글로벌 엔지니어 성장 로드맵 - 한국의 공학도/경력자들을 위한 자기 계발서 (출간예정)
미국 오기 전에 알았으면 좋았을 것들 - 미국 진출을 원하는 한국 경력자들을 위한 자기 계발서
미국 연구원과 엔지니어의 길 - 미국 기업 연구원/엔지니어에 대한 정보 전달
실리콘 밸리 북마크 - 실리콘 밸리와 한국의 IT업계를 이야기하는 칼럼
에세이
내일은 실리콘 밸리 - 어느 중년 엔지니어의 곤궁한 실리콘 밸리 이직담 (완).
미국에서 일하니 여전히 행복한가요 - 미국 테크 회사 직장 에세이
미술관에 또 가고 싶은 아빠 - 미술 + 육아 에세이
미술관으로 간 아빠 - 미술 + 육아 에세이 (완)
교양
미술관에 간 엔지니어 - 그래픽스 전공자 시선으로 바라본 미술사. 교양서.