[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
こちらも合わせてお読みください。
ここまでGPUにデータを渡すときはバッファを使っていました。
しかしint一つだけを渡す、なんてこともできます。
では、GPUにintをひとつ渡すサンプルを見てみましょう。
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") ); program.Build(devices, null, null, System.IntPtr.Zero); const int elementCount = 3; ComputeBuffer<float> buffer = new ComputeBuffer<float>( context, ComputeMemoryFlags.ReadWrite, elementCount ); ComputeKernel kernel = program.CreateKernel("myKernelFunction"); kernel.SetMemoryArgument(0, buffer); kernel.SetValueArgument(1, 2); ComputeCommandQueue commandQueue = new ComputeCommandQueue( context, devices[0], ComputeCommandQueueFlags.None ); commandQueue.Execute( kernel, null, new long[] { elementCount }, new long[] { 1 }, null ); var dataFromGpu = new float[elementCount]; commandQueue.ReadFromBuffer( buffer, ref dataFromGpu, true, null ); foreach (var item in dataFromGpu) { System.Console.WriteLine(item); } commandQueue.Dispose(); kernel.Dispose(); buffer.Dispose(); program.Dispose(); context.Dispose(); } }
__kernel void myKernelFunction(__global float* items, __const int number) { items[get_global_id(0)] = number; }
このサンプルプログラムは、まずGPU内にfloatが3つ連なったバッファを確保します。
そしてGPUに2という数字(int)を送ります。
GPUを動かして、2をバッファに代入します。
CPUにバッファの内容を読み戻し、表示します。
結果はこうなります:
2 2 2