pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

UnityでGPUを使って並列処理をしてみた(GPGPU)

こんにちは。

今回はタイトルにもあるように、UnityでGPUを使って、並列処理をする方法について書いていきたいと思います。

UnityでGPU計算がしたいと検索すると、コンピュートシェダーを使った方法がヒットするので、それでもいいと思うのですが、今回はもっと簡単に使える、Aleaというライブラリを使った方法でやってみたいと思います。

AleaをUnityにいれる

まず、AleaをUnityで使えるようにしていきます。

Aleaはnugetにあるので、それをダウンロードします。

以下のページのDownload packageからダウンロードします。

NuGet Gallery | Alea 3.0.4

ダウンロードができたら、ダウンロードしたnupkgファイルをzip解凍します。

同じようにして、Mono.Cecilというライブラリもダウンロードして、zip解凍します。

Mono.Cecilもnugetにあるので、以下のページからダウンロードすることができます。

NuGet Gallery | Mono.Cecil 0.11.2

そこまでできたら、UnityでAssetsのなかにPluginsという名前のフォルダを作ります。

f:id:SaidaTaisei:20200412210833p:plain

その作ったフォルダの中に先ほどダウンロードして、解凍したものを入れます。

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は下記のようになるはずです。

f:id:SaidaTaisei:20200412213114p:plain

これで、エラーが出ていなかったら準備完了です。

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()
    {
        
    }
}


実行すると、以下のようになります。

f:id:SaidaTaisei:20200412214039p:plain

ちゃんとintの配列に格納できていることがわかります。


ということで、今回はUnityでGPUを使った並列処理をやってみました。

今回は簡単なのしかやりませんでしたが、今度はGPUで処理する意味があるようなことをやりたいと思います。