왜 이 이름인가 — pipeline, descriptor set, layout의 역사적 배경과 설계 철학
“pipeline이 왜 pipeline이고, descriptor set이 왜 descriptor set인가?”
이름의 배경을 이해하면 암기 없이 오래 기억할 수 있다.
왜 “Pipeline"이라는 이름인가
역사 배경
GPU는 원래 그래픽 처리 하드웨어로 발전했다.
고전 그래픽스에서는 입력 정점(vertex)이 여러 단계를 거쳐 최종 픽셀이 되는 처리 흐름이 핵심이었다.
Vertex Input → Vertex Shader → Primitive Assembly
→ Rasterization → Fragment Shader → Output
이 흐름을 “Graphics Pipeline"이라고 불렀다.
Vulkan의 설계 관점
Vulkan은 이 전통을 유지하면서, “GPU가 어떤 상태/셰이더 조합으로 일을 할지"를 하나의 실행 객체로 묶었다.
Compute에서는 단계가 단순하지만 개념은 같다:
- 셰이더 코드 (어떤 연산)
- 고정/동적 상태
- 레이아웃 호환 조건
이 세 가지를 묶어서 “이 경로(pipeline)로 처리"한다고 보는 것.
Pipeline = 처리 모델 자체, 단순한 이름이 아니다.
왜 “Descriptor Set"이라는 이름인가
descriptor란?
GPU가 읽을 리소스(버퍼/이미지)를 직접 값으로 들고 있지 않는다.
“어디에 어떤 리소스가 있다"는 **설명자(descriptor)**를 통해 참조한다.
descriptor = 리소스를 가리키는 메타데이터
= "GPU 메모리 주소 X에 float 배열이 있다"
set이란?
실행에 필요한 descriptor들을 binding 번호에 맞춰 묶은 집합(set).
Set 0:
binding 0 → descriptor(a buffer)
binding 1 → descriptor(b buffer)
binding 2 → descriptor(out buffer)
“이번 실행에 쓸 데이터 참조들의 묶음” = Descriptor Set.
왜 “Layout"이 따로 있나 — 설계 철학
Vulkan은 런타임 모호성을 줄이고 검증을 앞당기기 위해 “실체"와 “규격"을 분리했다.
| 개념 | 역할 |
|---|---|
| Descriptor Set Layout | 슬롯 규격서 (타입/개수/stage 정보) |
| Descriptor Set | 규격에 맞춰 꽂은 실제 리소스 |
| Pipeline Layout | 파이프라인이 기대하는 전체 입력 규격 (sets + push constants) |
이 분리로 얻는 것:
- 호환성 검증 명확화: “이 set이 이 pipeline에 맞는가"를 런타임 전에 판정
- 드라이버 최적화: layout을 미리 알면 드라이버가 최적 메모리 배치를 준비
- 오류 조기 발견: 불일치가 늦게 터지지 않고 layout 생성/바인딩 시점에 드러남
기억용 한 문장
| 이름 | 한 문장 정의 |
|---|---|
| Pipeline | “어떻게 계산할지"에 대한 실행 경로 (처리 흐름의 전통) |
| Descriptor Set | “무엇으로 계산할지"에 대한 데이터 참조 묶음 |
| Layout | 파이프라인과 데이터 사이의 계약서 |
이해 확인 질문
Q1. pipeline이라는 이름이 그래픽 역사와 어떻게 연결되나?
정답 보기
GPU 원래 설계에서 정점이 여러 단계를 거쳐 픽셀이 되는 처리 흐름을 “graphics pipeline"이라 불렀다.
Vulkan은 이 전통을 유지하여 “GPU가 어떤 경로로 처리할지"를 pipeline 객체로 표현한다.
Q2. descriptor와 descriptor set의 차이는?
정답 보기
- Descriptor: 리소스 하나를 가리키는 메타데이터/참조 (버퍼의 주소, 크기 등)
- Descriptor Set: 실행에 필요한 여러 descriptor들을 binding 번호로 묶은 집합
Set은 여러 descriptor의 묶음이다.
Q3. layout 분리 설계가 성능/검증에 주는 이점은?
정답 보기
- 검증: descriptor set이 pipeline과 호환되는지를 runtime 전에 판정할 수 있다
- 성능: 드라이버가 layout 정보를 미리 알기 때문에 최적의 메모리 배치/캐싱 준비 가능
- 안정성: 불일치 오류가 dispatch 시점이 아니라 layout 생성/bind 시점에 드러난다
Q4. pipeline layout이 왜 “계약서"라고 불릴 수 있나?
정답 보기
Pipeline layout은 pipeline이 “나는 이런 descriptor set layout과 push constant를 기대한다"고 선언한다.
실제 dispatch 시 제공된 descriptor set은 이 선언과 일치해야 한다.
서로의 기대를 명시한 계약이기 때문에 계약서에 비유할 수 있다.
Q5. “pipeline vs descriptor set"을 역사 설명 없이 한 줄씩 정의해봐.
정답 보기
- Pipeline: GPU가 실행할 셰이더 코드와 실행 조건을 하나로 묶은 실행 경로 객체
- Descriptor Set: 그 실행에 필요한 버퍼/이미지 리소스들의 참조를 binding 번호로 묶은 객체
관련 글
- Vulkan 용어 직관 — 주방 비유로 각 개념 구분
- SPIR-V↔Vulkan 매핑 — 이름 뒤의 구조를 코드로 연결
- Layout 호환성 — “계약서"의 호환/비호환 규칙
관련 용어
[[descriptor-set]], [[pipeline-layout]], [[SPIR-V]], [[command-buffer]]