我已经在两个不同的系统上尝试过此代码:
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的代码,实际上它们都表示“成功”。
如果我尝试使用标志和地址空间的不同组合似乎并不重要-一个系统永远不会抛出,一个系统总是抛出。
我在这里想念什么?