Thirty Days of Metal — Day 3: Commands
This series of posts is my attempt to present the Metal graphics programming framework in small, bite-sized chunks for Swift app developers…
medium.com
요약: 커맨드, 인코딩에 대한 내용
What are Commands?
Metal은 함수에서 데이터를 생성해 동시에 실행할 수 없다. 데이터를 제공하는 것과 draw 명령어를 실행하는 것은 분리된 영역이다. 그리고 이런 구조에 따른 일반적인 아키텍처가 Metal Commands로 구성되어있다.
Queueing UP
명령어들을 실행할 큐를 만들기
GPU와 CPU는 분리되어 있어 동시에 실행할 수 있다.그래서 GPU는 우리가 코드상으로 직접 특정 명령어를 하라고 작동을 조작할 수 없다 (우리는 CPU 영역에서 코드와 데이터를 만든다.). 단지, 명령어 큐를 만들어 GPU가 앞으로 해야 할 작업을 넣어주면, 알아서 큐에서 작업을 빼 처리할 뿐이다. 이런 작업으로 Metal은 기본적으로 Queue를 같은 규약을 지닌다.
device.makeCommandQueue()! //MTLCommandQueue
👉 우리의 코드가 직접 GPU로 향하는 인스턴스다. 그렇기 때문에 상당히 복잡하고 무겁다고 한다. 최대한 조금(한 개) 만든다.3인칭 시점과 1인칭 시점 동시에 제공하는 프로그램에도 하나만 만드는지는 아직 모른다…
커맨드 큐에서 커맨드 버퍼를 만들 수 있다. ⇒ MTLBuffer가 아님
커맨드 버퍼는 작업에 필요한 내용들(함수, MTLBuffer 등등 추후에 계속…)을 모아놓은 구조이다.
MTLCommandBuffer
인스턴스는 addCompletedHandler
고차 메서드가 내장되어 명령이 다 끝나고 나서 필요한 명령어를 추가할 수 있다.
MTLCommandBuffer
인스턴스의commit
메서드는 버퍼가 GPU로 실행하라는 것을 의미한다. 일반적인 코드상 함수 콜과 비슷하다.
Encoding Commands
커맨드 버퍼에서 사용하는 데이터가 있다. (ex: 실수형 배열 데이터) 이런 데이터들이 GPU에서 작동하기 위해선 여러 조건들을 미리 알려주어야한다. 그리고 이 조건들을 담는 공간을 encoder로 정해놓았다.
- 조건의 예시 ⇒ 추상적이다. 코드가 구체적
- 이 명령어는 머신러닝을 위한 것인가 그래픽을 위한 것이가
- MTLBuffer에서 어디까지가 색을 의미하는 것이고 어디까지가 위치를 의미하는 것인가
- MTLBuffer의 타입은 무엇이고 몇 번째 위치부터 읽는가
endEncoding
메서드로 종료한다.
코드
'Metal > Thirty Days of Metal (Warren Moore)' 카테고리의 다른 글
Day6. Pipelines + CommandEncoder (0) | 2023.07.21 |
---|---|
Day5. Shaders (0) | 2022.12.04 |
Day4. MTKView (0) | 2022.12.04 |
Day1. Devices (0) | 2022.11.17 |
Day2. Buffers (0) | 2022.11.17 |
댓글