[iOS] Metal에서 GPU 컴퓨팅 (6) MTLCommandQueue

이 기사는 Metal Advent Calendar2016의 9일째입니다.

지금까지 Metal의 GPU 컴퓨팅에 대해 해설 기사를 써 왔습니다.
[iOS] Metal에서 GPU 컴퓨팅 (1) 최소한의 코드 작성 및 특성 파악
[iOS] Metal에서 GPU 컴퓨팅 (2) 군지능
[iOS] Metal에서 GPU 컴퓨팅 (3) MTLDevice
[iOS] Metal에서 GPU 컴퓨팅 (4) MTKView
[iOS] Metal에서 GPU 컴퓨팅 (5) MTLLibrary
이 기사에서는 지난 번에 계속해서 Apple이 제공하는 샘플 코드에 대해 설명합니다.

취급하는 샘플 코드는, 전회와 같은 라이프게임의 앱, MetalGameOfLife입니다.
MetalGameOfLife


(실행 화면)

이번에는 샘플 코드의 MTLCommandQueue에 대해 설명합니다.
MTLCommandQueue는 명령 버퍼 (MTLCommandBuffer의 객체)의 입니다. 또한 MTLCommandBuffer의 객체 생성에도 사용됩니다.
명령 버퍼는 GPU로 전달되는 인코딩된 명령어를 저장합니다.

MTLCommandQueue는 클래스가 아닌 프로토콜입니다.
명령 대기열은 스레드로부터 안전하며 여러 명령 버퍼를 동시에 인코딩할 수 있습니다.

다시 말하지만, 이 샘플 코드는 주로 다음 파일로 구성되어 있습니다.

AAPLRender.h
AAPLRender.m
AAPLViewController.h
AAPLViewController.m
Sharder.metal

이 중 AAPLRender.m에는 병렬 컴퓨팅 및 드로잉의 CPU측의 로직이 Shader.metal에는 정점 셰이더, 프래그먼트 셰이더, GPU 컴퓨팅용 셰이더가 쓰여져 있습니다.

여기에서는 샘플 코드 내에서 MTLCommandQueue의 사용 부분을 설명합니다.
AAPLRender.m에는 다음 설명이 있습니다.

AAPLRender.m
@property (nonatomic, strong) id<MTLCommandQueue> commandQueue;
...
_commandQueue = [_device newCommandQueue];

MTLDevice의 newCommandQueue 메소드는 명령 큐 오브젝트를 생성합니다. 커멘드 큐는 makeCommandQueue(maxCommandBufferCount:) 메소드에서도 생성할 수 있습니다만, 이 경우는 격납되는 미실행의 커멘드 버퍼수의 상한이 설정됩니다.

명령 버퍼는 매번 여러 번 생성되지만 명령 큐 생성은 앱이 시작될 때 한 번만 수행하면 충분합니다.

또, 이하의 코드에서는, 커멘드 버퍼로부터 커멘드 큐의 생성을 행하고 있습니다.

AAPLRender.m
id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];

커멘드 버퍼의 생성은, commandBuffer 메소드, 혹은 commandBufferWithUnretainedReferences 메소드로 실시합니다. commandBuffer 메서드는 내부에서 사용되는 리소스에 대한 강한 참조이지만 commandBufferWithUnretainedReferences 메서드는 강한 참조가 아닙니다. 대부분의 경우 commandBuffer 메서드가 사용됩니다.

커맨드 버퍼의 생성 후, 이것에 대해서 GPU 컴퓨팅의 설정, 및 렌더링의 설정이 이루어지고, 커멘드 버퍼가 실행(commit) 됩니다.

AAPLRender.m
[self encodeComputeWorkInBuffer:commandBuffer];

[self encodeRenderWorkInBuffer:commandBuffer];

[commandBuffer commit];

따라서 MTLCommandQueue는 명령 버퍼를 관리하는 역할을 담당합니다.

이번에는 라이프 게임 샘플 코드 내에서 MTLCommandQueue의 해설을 실시했습니다.
다음 번 이후, 또 다른 개소에 대한 해설을 실시해 갑니다.

좋은 웹페이지 즐겨찾기