忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

C#でOpenCL入門 (OpenCLNet版) コンテキスト

コンテキスト

こちらも合わせてお読みください。
前回はGPUやCPUといったハードウェアを司るデバイスオブジェクトを扱いました。
しかし実はデバイスオブジェクトでは大したことはできません。
そこらへんXnaやDirectXに似ていますね。

そこで登場するのがこのコンテキストオブジェクトです。
コンテキストはひとつ以上のデバイスをまとめるオブジェクトです。
OpenCLに必要なGPUを動かす命令、メモリ領域などは全てこれを通して作ります。


コンテキストの生成

コンテキストを生成する方法は(オリジナルのOpenCLと比べて)やや奇妙です。
プラットフォームから作ります。
Platform.CreateContext()メソッドが使えるようです。

public Context CreateContext(IntPtr[] contextProperties, Device[] devices, ContextNotify notify, IntPtr userData);

contextPropertiesはコンテキストを生成する時の情報です。正直IntPtrは扱いたくないですね…。nullでも構いません。

devicesはこのコンテキストを生成するのに使うデバイスです。つまり、コンテキストというのはデバイスをひとつ以上まとめたオブジェクトなわけですね。重複して同じデバイスが入っている場合は片方が無視されると昔の私のメモに書いてありました。

notifyはエラー情報を受け取るコールバック関数です。nullでも構いません。

using OpenCLNet;

class Program
{
    static void Main()
    {
        var platform = OpenCL.GetPlatform(0);
        var context = platform.CreateContext(
            null, 
            platform.QueryDevices(DeviceType.DEFAULT),
            null, 
            System.IntPtr.Zero
            );
        context.Dispose();
    }
}

このプログラムは何も表示しません。
とりあえず、コンテキストの生成と破棄をするだけのプログラムです。

さて、Platform.CreateContext()はやけに引数が多いですね。
もっと簡単なPlatform.CreateDefaultContext()もあります。

using OpenCLNet;

class Program
{
    static void Main()
    {
        var platform = OpenCL.GetPlatform(0);
        var context = platform.CreateDefaultContext();
        context.Dispose();
    }
}

このメソッドもどうやら同じようにコンテキストを生成するようです。

拍手[0回]

PR