Metal並列プログラミング:【初期化】の手順

Appleのサイトを確認しながらMetalプログラムの初歩をマスターしたいと思います。 一気に書くと複雑になりそうなので【初期化】と【前処理&実行】に分けます。

座学状態で書いています。 実際に動かしたときに変更が必要であれば随時更新します。

0. MetalKitをimportする

大前提。これなしには始められません。

import MetalKit

1. GPUバイスを取得する

まずは描画や計算に使用するGPUバイスを取得する必要があります。 下記の関数でデフォルトGPUバイスを取得します。

let device = MTLCreateSystemDefaultDevice()

MacOSの場合はGPUバイスが複数搭載されている場合があるため、搭載されているGPUを確認して選択することもできます。 https://developer.apple.com/documentation/metal/choosing_gpus_on_mac

2.コマンドキューを作る

GPUへ何かを要求したいときにはコマンドキューを介して要求を送ります。GPUはキューに溜まっている要求を順々に実行しています。関数を実行して直接結果を受け取るモデルとは少し違いますね。

下記の関数でコマンドキューを作成します。

let commandQueue = device.makeCommandQueue()

3.コマンドバッファを作る

コマンドキュー上に要求を入れるためのバッファを作ります。

let commandBuffer = commandQueue.makeCommandBuffer()

シングルスレッドアプリではコマンドバッファを1つ作ります。 マルチスレッドアプリで並列処理から別々に要求を送りたい場合には必要な数のバッファを作ります。

4.エンコーダーを取得する

コマンドバッファからエンコーダーを取得します。 エンコーダーは複数の種類があり目的に適したものを取得します。

今回使用するエンコーダはMTLComputeCommandEncoderです。

let encoder = commandBuffer.makeComputeCommandEncoder()

5. デフォルトライブラリを取得する

バイスからMTLLibraryを取得します。 MTLLibraryはMetalの並列処理プログラム言語(Metal shading languange)コードを保持してswiftで扱えるよう機能を提供します。

let library = device.makeDefaultLibrary()

初期化はここまで。 基本的にはアプリの起動時に一度だけ初期化します。