忍者ブログ

Memeplexes

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

C#でOpenCL入門 (Cloo版) OpenCL Cのコンパイルエラー補足

コンパイルエラーを見つける

こちらも合わせてお読みください。

前回のプログラムは、GPU側で動くプログラムのソースコードが原因でコンパイルエラーが起きた場合、それを知ることはできませんでした。
今回はそのコンパイルエラーを補足する方法を解説します。


GetBuildLog

OpenCL Cのコードをビルドしてコンパイルエラーが起きると、例外が投げられます。
そのときにComputeProgram.GetBuildLogというメソッドがあるので、それを使いましょう。

public string GetBuildLog(ComputeDevice device);

この戻り値の中にコンパイルエラーの説明が入っています。

サンプルコード

ではここであえておかしなOpenCL Cのコードを書いてみます。
ビルドしてエラーが起きるようなコードをわざと書くのです。

myKernelProgram.cl

__kernel void myKernelFunction(__global float* items)
{
	items[0] = 0
}

あーこれはいけません。
3行目の最後にセミコロン(;)がありません。
これではコンパイルエラーです。
例外が発生してしまうでしょう。
(そのためにこうしたのですが)

Program.cs

using Cloo;
using System.Linq;

class Program
{
    static void Main()
    {
        ComputePlatform platform = ComputePlatform.Platforms[0];
        ComputeDevice[] devices = platform
            .Devices
            .Where(d => d.Type == ComputeDeviceTypes.Gpu)
            .ToArray();
        ComputeContext context = new ComputeContext(
            devices,
            new ComputeContextPropertyList(platform),
            null, 
            System.IntPtr.Zero
            );
        ComputeProgram program = new ComputeProgram(
            context,
            System.IO.File.ReadAllText("myKernelProgram.cl")
            );

        try
        {
            program.Build(devices, null, null, System.IntPtr.Zero);
        }
        catch
        {
            System.Console.WriteLine(program.GetBuildLog(devices[0]));
        }


        program.Dispose();
        context.Dispose();
    }
}

このプログラムを実行すると、コンソールにOpenCL Cのコンパイルエラーが表示されます。

拍手[0回]

PR