忍者ブログ

Memeplexes

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

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

コンテキスト

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

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


コンテキストの生成

コンテキストを生成するには、ComputeContextのコンストラクタを使います。

public ComputeContext(ComputeDeviceTypes deviceType, ComputeContextPropertyList properties, ComputeContextNotifier notify, IntPtr userDataPtr);
public ComputeContext(ICollection<ComputeDevice> devices, ComputeContextPropertyList properties, ComputeContextNotifier notify, IntPtr notifyDataPtr);

deviceTypeはコンテキストが保持するデバイスのタイプです。

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

propertiesはコンテキストを生成する時の情報です。プラットフォームの情報はここに入れます。

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

userDataPtrnotifyDataPtrは同じものでしょうか?とりあえずSystem.IntPtr.Zeroでいいでしょう。おそらくコールバックに渡されるユーザーデータでしょう。

using Cloo;
using System.Linq;

class Program
{
    static void Main()
    {
        ComputePlatform platform = ComputePlatform.Platforms[0];
        ComputeContext context = new ComputeContext(
            platform.Devices.Where(d => d.Type == ComputeDeviceTypes.Gpu).ToArray(),
            new ComputeContextPropertyList(platform),
            null, 
            System.IntPtr.Zero
            );
        context.Dispose();
    }
}

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

拍手[1回]

PR