OpenCL内核静默运行失败

时间:2018-10-01 14:53:33

标签: c# opencl cloo

我已经在两个不同的系统上尝试过此代码:

using System;
using System.Collections.Generic;
using System.Linq;
using Cloo;

namespace MinimalExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var input = Enumerable.Range(0, 10).ToArray();
            var output = new int[input.Length];
            var platform = ComputePlatform.Platforms.First();
            var context = new ComputeContext(
                platform.Devices,
                new ComputeContextPropertyList(platform), 
                null,
                IntPtr.Zero
            );
            var queue = new ComputeCommandQueue(
                context,
                platform.Devices.First(),
                ComputeCommandQueueFlags.None
            );
            var program = new ComputeProgram(
                context,
                "void kernel some_test(constant int* a, global int* b) { " + 
                     int i = get_global_id(0);
                     b[i] = a[i];
                 }");
            program.Build(null, string.Empty, null, IntPtr.Zero);
            using (var kernel = program.CreateKernel("some_test"))
            using (var inBuff = new ComputeBuffer<int>(context, ComputeMemoryFlags.ReadOnly | ComputeMemoryFlags.UseHostPointer, input))
            using (var outBuff = new ComputeBuffer<int>(context, ComputeMemoryFlags.WriteOnly | ComputeMemoryFlags.UseHostPointer, output))
            {
                kernel.SetMemoryArgument(0, inBuff);
                kernel.SetMemoryArgument(1, outBuff);
                var events = new List<ComputeEventBase>();
                queue.Execute(kernel, null, new long[] { input.Length }, null, events);
                queue.Finish();
            }
            if (output.All(x => x == 0)) throw new Exception("Output buffer not written.");
        }
    }
}
  • 在我的桌面系统上,该程序不会抛出(output具有读取内核代码时所期望的值)。该系统具有支持OpenCL 2.1的AMD GPU。

  • 在我的笔记本电脑上,该程序抛出最后一行。这意味着内核没有按照我的预期运行,或者根本没有运行。该系统具有支持OpenCL 2.1的Intel CPU和支持OpenCL 1.2的Nvidia GPU,它们都表现出相同的行为。从Nvidia下载的OpenCL样本似乎可以自我测试并正常通过。

Cloo检查不成功的返回码,并在任何地方返回错误时抛出。但是以防万一,我直接检查了OpenCL返回给Cloo的代码,实际上它们都表示“成功”。

如果我尝试使用标志和地址空间的不同组合似乎并不重要-一个系统永远不会抛出,一个系统总是抛出。

我在这里想念什么?

0 个答案:

没有答案