Top > Programming > OpenCL > OpenCLSharp > Tutorial > 1_CheckOpenCLEnvironment
Last-modified: Sat, 07 Sep 2013 20:25:58 JST
Counter:5016 Today:5 Yesterday:0 Online:9
このエントリーをはてなブックマークに追加

OpenCLプラットフォームの有無を確認する

About

OpenCLを使ったアプリケーションを動作させたり、そのプログラミングを行う前に、OpenCLが対象のPCで実行可能かどうか、すなわちOpenCLが実行できるプラットフォームが存在するかどうかを確認する必要があります。また、OpenCLにはInterl系やAMD系、NVIDIA系など様々なプラットフォームが存在します。そのため1つのPCの内部に複数の環境が混在することも考えられます。対象のPCにいくつのプラットフォームが存在し、OpenCLが実行できるのかどうか、を確認します。

C#からOpenCLを利用できるようにする

OpenCLは元々C/C++言語から利用するように開発されています。したがってC#(.Net)から利用するには、特別な手順を取る必要があります。OpenCLのDLLを参照し、そのDLLに定義される関数(≒メソッド)をC#から参照するには、DllImport属性を利用します。ここではOpenCL(のDLL)に定義される、'clGetPlatformIDs'メソッドを利用するため、フィールドに次のように定義します。※ここでは'DllImport'ないし'属性'などの説明を割愛します。

    public const string OpenCL = "OpenCL.dll";

    //対象のDLLを読み込んで、DLL中のメソッドを実行可能にします。
    //ここではDLL中の'clGetPlatformIDs'メソッドを利用します。
    [DllImport(OpenCL)]
    public static extern int clGetPlatformIDs
        (uint num_entries,
        IntPtr[] platforms,
        out uint num_platforms);

clGetPlatformIDsメソッドを利用する

clGetPlatformIDsを利用すると、実行した PC に存在する OpenCL のプラットフォーム数を取得することができます。本来はメソッドの名前の通り、プラットフォームの ID(への参照) を取得するメソッドですが、プラットフォーム数を取得する目的でも利用することができます。

メソッドの1つ目の引数には、ID を取得したいプラットフォームの数を指定しますが、ここでは 0 で良いです。2つ目の引数には、本来であれば、ID を取得するプラットフォームへの参照(の配列)を指定しますが、ここでは null を与えます。ここで取得して確認したいのはプラットフォーム数であるためです。したがって、1つ目の引数も 0 としています。最後に、参照渡しでプラットフォーム数を代入するための引数を指定します。

ここで、多くの OpenCL の関数では、関数の実行が正常に終了するとき、その戻り値が '0' となります。正常終了時の戻り値(0)を、OpenCL では CL_SUCCESS という定数で定義しています。clGetPlatformIDs 関数の実行に成功したときも '0(= CL_SUCCESS)' が戻るので、これを利用して関数の正常な実行を確認しておきます。この手続きは OpenCL による関数の実行の多くに共通です。

実行に成功すると、参照渡しで指定した変数(ここでは platformCount )に、実行環境下にある OpenCL のプラットフォーム数が代入されています。

class Program
{
    public const string OpenCL = "OpenCL.dll";

    //対象のDLLを読み込んで、DLL中のメソッドを実行可能にします。
    //ここではDLL中の'clGetPlatformIDs'メソッドを利用します。
    [DllImport(OpenCL)]
    public static extern int clGetPlatformIDs
        (uint num_entries,
        IntPtr[] platforms,
        out uint num_platforms);

    public const int CL_SUCCESS = 0;

    static void Main()
    {
        uint platformCount;

        int errcode = clGetPlatformIDs(0u, null, out platformCount);

        if (errcode != CL_SUCCESS)
            Console.WriteLine("Error at clGetPlatformIDs : " + errcode);
        else
            Console.WriteLine("Number of OpenCL Platforms : " + platformCount.ToString());

        Console.ReadLine();
    }
}

実行結果はおよそ次のようになるはずです。実行環境下にあるOpenCLのプラットフォーム数によって、実行結果は異なります。またこれを正常に実行できない場合、その PC では OpenCL を利用できない、ということになります。

Number of OpenCL Platforms : 1