[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こちらも合わせてお読みください。
前回のプログラムは、GPU側で動くプログラムのソースコードが原因でコンパイルエラーが起きた場合、それを知ることはできませんでした。
今回はそのコンパイルエラーを補足する方法を解説します。
OpenCL Cのコードをビルドしてコンパイルエラーが起きると、例外が投げられます。
そのときにComputeProgram.GetBuildLogというメソッドがあるので、それを使いましょう。
public string GetBuildLog(ComputeDevice device);
この戻り値の中にコンパイルエラーの説明が入っています。
ではここであえておかしなOpenCL Cのコードを書いてみます。
ビルドしてエラーが起きるようなコードをわざと書くのです。
__kernel void myKernelFunction(__global float* items) { items[0] = 0 }
あーこれはいけません。
3行目の最後にセミコロン(;)がありません。
これではコンパイルエラーです。
例外が発生してしまうでしょう。
(そのためにこうしたのですが)
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のコンパイルエラーが表示されます。