[iOS] Metal에서 GPU 컴퓨팅(9) MTLComputePipelineState

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

지금까지 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
[iOS] Metal에서 GPU 컴퓨팅 (6) MTLCommandQueue
[iOS] Metal에서 GPU 컴퓨팅 (7) MTLCommandBuffer
[iOS] Metal에서 GPU 컴퓨팅 (8) MTLComputeCommandEncoder
이 기사에서는 지난 번에 계속해서 Apple이 제공하는 샘플 코드에 대해 설명합니다.

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


(실행 화면)

이번은, 샘플 코드내의 MTLComputePipelineState 에 대해서 해설을 실시합니다.
MTLComputePipelineState는 MTLFunction 내의 컴퓨팅에 대한 함수를 컴파일하는 데 사용됩니다.
MTLComputePipelineState는 클래스가 아닌 프로토콜로, MTLDevice의 객체에 의해 생성됩니다.
MTLComputePipelineState의 객체 생성은 비용이 많이 들기 때문에 앱이 시작될 때 한 번 생성하면 충분합니다.

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

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

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

여기에서는, 샘플 코드내에 있어서의 MTLComputePipelineState 의 사용 개소를 해설해 갑니다.
AAPLRender.m에는 다음 설명이 있습니다.

AAPLRender.m
@property (nonatomic, strong) id<MTLComputePipelineState> simulationPipelineState;
@property (nonatomic, strong) id<MTLComputePipelineState> activationPipelineState;
...
   MTLComputePipelineDescriptor *descriptor = [MTLComputePipelineDescriptor new];
    descriptor.computeFunction = [_library newFunctionWithName:@"game_of_life"];
    descriptor.label = @"Game of Life";
    _simulationPipelineState = [_device newComputePipelineStateWithDescriptor:descriptor
                                                                      options:MTLPipelineOptionNone
                                                                   reflection:nil
                                                                        error:&error];
...
    descriptor.computeFunction = [_library newFunctionWithName:@"activate_random_neighbors"];
    descriptor.label = @"Activate Random Neighbors";
    _activationPipelineState = [_device newComputePipelineStateWithDescriptor:descriptor
                                                                      options:MTLPipelineOptionNone
                                                                   reflection:nil
                                                                        error:&error];                                                                     

MTLComputePipelineState 의 오브젝트를 생성할 때는, MTLComputePipelineDescriptor 를 개입시켜 컴퓨팅용의 함수를 지정합니다. @"game_of_life"와 @"activate_random_neighbors"는 함수 이름입니다. 이 샘플 코드는 각 프레임마다 실행되는 함수와 화면 탭시에 실행되는 함수를 가지며, 각각 다른 MTLComputePipelineState 객체로 인코딩됩니다.

각 MTLComputePipelineState 객체는 다음 위치에서 명령 인코더에 설정됩니다.

AAPLRender.m
[commandEncoder setComputePipelineState:self.simulationPipelineState];
...
[commandEncoder setComputePipelineState:self.activationPipelineState];

이와 같이 MTLComputePipelineState는 컴퓨팅을 위한 함수를 인코딩하고 저장하는 역할을 한다.

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

좋은 웹페이지 즐겨찾기