[iOS] Metal에서 GPU 컴퓨팅 (3) MTLDevice

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

이전에 Metal의 GPU 컴퓨팅에 대한 설명 기사를 썼습니다.
[iOS] Metal에서 GPU 컴퓨팅 (1)
[iOS] Metal에서 GPU 컴퓨팅 (2)
이 기사에서는 몇 번에 나누어 애플이 제공하는 GPU 컴퓨팅 샘플 코드의 해설을 하고 싶습니다.

Apple이 제공하는 Metal의 샘플 코드에는 MetalGameOfLife라는 것이 있습니다.
MetalGameOfLife


(실행 화면)

이른바 라이프게임 의 앱입니다만, Metal의 병렬 프로그래밍에 대한 좋은 데모가 되고 있습니다.
앞으로이 샘플 코드를 기반으로 Metal의 병렬 프로그래밍에 대해 설명합니다.

이 샘플 코드는 주로 다음 파일로 구성됩니다.

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

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

먼저 MTLDevice에 대해 설명합니다.
MTLDevice는 단일 GPU 인터페이스입니다.
MTLDevice등의 Metal 관련의 기능의 대부분은 클래스가 아니고 프로토콜입니다만, Metal가 동작하는 디바이스마다 오브젝트의 형태가 다르기 때문에, 구현보다 인터페이스를 중시했기 때문이라고 생각됩니다.
(참고) 오 bjc. 이오

샘플 코드에서는 프로토콜을 구현한 객체의 생성을 AAPLViewController.m에서 실시하고 있습니다.
MTKView이 MTLDevice를 구현한 객체를 속성으로 가질 필요가 있기 때문입니다.

AAPLViewController.m
@property (nonatomic, weak) MTKView *metalView;
...
self.metalView = (MTKView *)self.view;
...
self.metalView.device = MTLCreateSystemDefaultDevice();


AAPLRender 측에서는 이것을 View 마다 받아, weak인 프로퍼티에 넣어 둡니다.

AAPLRender.m
@property (nonatomic, weak) id<MTLDevice> device;
...
_device = _view.device;


이 _device를 사용하여 다음 프로토콜을 구현하는 객체가 생성됩니다.
  • MTLLibrary
  • MTLCommandQueue
  • MTLBuffer
  • MTLRenderPipelineState
  • MTLTexture
  • MTLComputePipelineState
  • MTLSamplerState

  • 따라서 MTLDevice는 다양한 Metal 관련 객체를 생성하는 데 사용되는 매우 중요한 프로토콜입니다.

    그건 그렇고, GPU의 이름은 MTLDevise의 name 속성으로 얻을 수 있습니다.
    NSLog(@"Devise name: %@", self.metalView.device.name); 
    

    예를 들어 iPhone6 ​​Plus의 경우 위는 Apple A8 GPU로 출력됩니다.

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

    좋은 웹페이지 즐겨찾기