忍者ブログ

Memeplexes

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

C#でOpenCL入門 (OpenCLNet版) 非バッファ引数

バッファの参照ではなくintをGPUに渡す

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

ここまでGPUにデータを渡すときはバッファを使っていました。
しかしint一つだけを渡す、なんてこともできます。


サンプルコード

では、GPUにintをひとつ渡すサンプルを見てみましょう。

Program.cs

using OpenCLNet;

class Program
{
    static void Main()
    {
        var platform = OpenCL.GetPlatform(0);
        var context = platform.CreateDefaultContext();
        var commandQueue = context.CreateCommandQueue(platform.QueryDevices(DeviceType.DEFAULT)[0]);

        var program = context.CreateProgramWithSource(
            System.IO.File.ReadAllText("myKernelProgram.cl")
            );
        program.Build();

        var kernel = program.CreateKernel("myKernelFunction");
        const int elementCount = 3;
        var buffer = context.CreateBuffer(
            MemFlags.READ_WRITE, 
            elementCount * sizeof(float)
            );
        kernel.SetArg(0, buffer);
        kernel.SetArg(1, 2);
        commandQueue.EnqueueNDRangeKernel(
            kernel,
            1,
            null,
            new[] { elementCount },
            new[] { 1 });

        var readBack = new float[elementCount];
        buffer.Read(commandQueue, 0, readBack, 0, readBack.Length);

        foreach (var number in readBack)
        {
            System.Console.WriteLine(number);
        }

        buffer.Dispose();
        kernel.Dispose();
        program.Dispose();
        commandQueue.Dispose();
        context.Dispose();
    }
}

myKernelProgram.cl

__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

拍手[0回]

PR