こんにちは。
今回はタイトルにもあるように、UnityでGPUを使って、並列処理をする方法について書いていきたいと思います。
UnityでGPU計算がしたいと検索すると、コンピュートシェダーを使った方法がヒットするので、それでもいいと思うのですが、今回はもっと簡単に使える、Aleaというライブラリを使った方法でやってみたいと思います。
AleaをUnityにいれる
まず、AleaをUnityで使えるようにしていきます。
Aleaはnugetにあるので、それをダウンロードします。
以下のページのDownload packageからダウンロードします。
ダウンロードができたら、ダウンロードしたnupkgファイルをzip解凍します。
同じようにして、Mono.Cecilというライブラリもダウンロードして、zip解凍します。
Mono.Cecilもnugetにあるので、以下のページからダウンロードすることができます。
NuGet Gallery | Mono.Cecil 0.11.2
そこまでできたら、UnityでAssetsのなかにPluginsという名前のフォルダを作ります。
その作ったフォルダの中に先ほどダウンロードして、解凍したものを入れます。
Windowsの64bitを使っている人(ほとんどの人が当てはまると思います)であれば僕と同じようにすれば大丈夫です。
alea/lib/net45のdllファイル全部と
alea/toolsのFsharp.Core.dllとAlea.CUDA.CT.Native.X86.B64.Windows.dllと
mono.ceil/lib/net40のMono.Cecil.dll
をPluginsの中にドラッグアンドドロップします。
すると、Pluginsは下記のようになるはずです。
これで、エラーが出ていなかったら準備完了です。
GPUを使ってみる
せっかくgpuを使うので、凝ったことをやりたい気もするのですが、今回はとりあえず導入ということで、簡単なことだけやりたいと思います。
とりあえず、int型の配列に数字を入れてみました。
サンプルコードは以下に示します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Alea; using Alea.Parallel; public class test : MonoBehaviour { // Start is called before the first frame update void Start() { Gpu gpu = Gpu.Default; int[] list = new int[100]; gpu.For(0, 100, i => { list[i] = i; }); for (int i = 0; i < 100; i++) { Debug.Log(list[i]); } } // Update is called once per frame void Update() { } }
実行すると、以下のようになります。
ちゃんとintの配列に格納できていることがわかります。
ということで、今回はUnityでGPUを使った並列処理をやってみました。
今回は簡単なのしかやりませんでしたが、今度はGPUで処理する意味があるようなことをやりたいと思います。