[iOS]Metal에서 GPU 컴퓨팅(5) MTLLibrary

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

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

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


(실행 화면)

이번은, 샘플 코드내의 MTLLibrary 에 대해서 해설을 실시합니다.
MTLLibrary를 이용함으로써 GPU측의 언어 Metal shading language의 함수를 CPU측의 언어 Objective-C나 Swift로 취급하는 것이 가능하게 됩니다.

MTLLibrary는 클래스가 아닌 프로토콜입니다.
MTLLibrary를 따르는 객체는 Metal shading languange의 소스 코드를 포함합니다. 셰이더 파일에 있는 소스 코드는 빌드 시 컴파일되고 문자열로 작성된 MSL 코드는 런타임에 컴파일됩니다.
MTLLibrary의 객체를 생성하기 위해서는, MTLDevice의 메소드를 이용합니다.

컴파일된 바이너리에서 라이브러리를 만드는 경우 다음 메서드 중 하나를 사용합니다.
  • newDefaultLibrary()
  • makeLibrary(filepath:)
  • makeLibrary(data:)

  • 또, 런타임으로 텍스트로부터 컴파일해 라이브러리를 만드는 경우는, 이하의 메소드의 어떤 것인가를 이용합니다.
  • makeLibrary(source:options:completionHandler:)
  • makeLibrary(source:options:)

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

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

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

    여기에서는 샘플 코드 내에서 MTLLibrary의 사용 부분을 설명합니다.
    AAPLRender.m에는 다음 설명이 있습니다.
    Objective-C: AAPLRender.m
    @property (nonatomic, strong) id<MTLLibrary> library;
    ...
    _library = [_device newDefaultLibrary];

    MTLDevice의 newDefaultLibrary 메소드는 라이브러리를 생성합니다.
    이 샘플 코드에서는, 컴파일 끝난 바이너리로부터 라이브러리의 생성을 행하고 있는 번역입니다.

    다음의 코드에서는, 정점 셰이더 및 프래그먼트 셰이더의 컴파일 끝난 함수를, MTLFunction 에 따르는 오브젝트에 포함하고 있습니다.

    AAPLRender.m
        id<MTLFunction> vertexProgram = [_library newFunctionWithName:@"lighting_vertex"];
        id<MTLFunction> fragmentProgram = [_library newFunctionWithName:@"lighting_fragment"];
    

    @"lighting_vertex"및 @"lighting_fragment"는 Shader.metal에 설명된 함수 이름입니다.

    또한 다음 코드에서는 컴퓨팅용으로 컴파일된 함수를 MTLComputePipelineDescriptor 클래스의 개체 속성으로 설정합니다.

    AAPLRender.m
    descriptor.computeFunction = [_library newFunctionWithName:@"game_of_life"];
    ...
    descriptor.computeFunction = [_library newFunctionWithName:@"activate_random_neighbors"];
    
    

    @"game_of_life"및 @"activate_random_neighbors"는 Shader.metal에 설명된 함수 이름입니다.

    이처럼 MTLLibrary는 Metal shading language의 함수를 다루는 인터페이스의 역할을 하고 있습니다.

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

    좋은 웹페이지 즐겨찾기