Как я могу получить данные с Cloo - PullRequest
0 голосов
/ 08 мая 2020

Hy All,

Я нашел здесь пример использования Cloo: ссылка

Я немного изменяю источник, это копия массива, попробуйте получить результат, но массив dst не записан. В режиме отладки C# массив dst заполняется нулями. Как я могу настроить Cloo для записи массива dst?

код:

class Program
{
    static string clSource =
        @"
            kernel void function(global int* src, global int* dst, int size) 
            {
                for (int i = 0; i < size; i++) 
                {
                    dst[i] = src[i];
                    //printf(""src: %d\n"",src[i]);
                    //printf(""dst: %d\n"",dst[i]);
                }
            }
        ";

    static void Main(string[] args)
    {
        // pick first platform
        ComputePlatform platform = ComputePlatform.Platforms[0];

        // create context with all gpu devices
        ComputeContext context = new ComputeContext(ComputeDeviceTypes.Gpu,
        new ComputeContextPropertyList(platform), null, IntPtr.Zero);

        // create a command queue with first gpu found
        ComputeCommandQueue queue = new ComputeCommandQueue(context,
        context.Devices[0], ComputeCommandQueueFlags.None);

        // create program with opencl source
        ComputeProgram program = new ComputeProgram(context, clSource);

        // compile opencl source
        program.Build(null, null, null, IntPtr.Zero);

        // load chosen kernel from program
        ComputeKernel kernel = program.CreateKernel("function");

        // create a ten integer array and its length
        int[] src = new int[] { 1, 2, 3, 4, 5 };
        int size = src.Length;
        int[] dst = new int[size];

        // allocate a memory buffer with the message (the int array)
        ComputeBuffer<int> srcBuffer = new ComputeBuffer<int>(context,
        ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.UseHostPointer, src);

        ComputeBuffer<int> dstBuffer = new ComputeBuffer<int>(context,
        ComputeMemoryFlags.ReadWrite | ComputeMemoryFlags.UseHostPointer, dst);

        kernel.SetMemoryArgument(0, srcBuffer); // set the integer array
        kernel.SetMemoryArgument(1, dstBuffer); // set the integer array
        kernel.SetValueArgument(2, size); // set the array size

        // execute kernel
        queue.ExecuteTask(kernel, null);

        // wait for completion
        queue.Finish();

        //Console.ReadKey();
    }
}
...