[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こちらも合わせてお読みください。
前回は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(); } }
このメソッドもどうやら同じようにコンテキストを生成するようです。