Я пробовал этот код на двух разных системах:
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
имеет значения, которые вы ожидаете от чтениякод ядра).Эта система имеет графический процессор AMD с поддержкой OpenCL 2.1.
На моем ноутбуке эта программа выбрасывает последнюю строку.Это означает, что ядро работает не так, как я планировал, или вообще не работает.Эта система оснащена процессором Intel с поддержкой OpenCL 2.1 и графическим процессором Nvidia с поддержкой OpenCL 1.2, все они демонстрируют одинаковое поведение.Образцы OpenCL, загруженные из Nvidia, похоже, проходят самопроверку и проходят нормально.
Cloo проверяет коды ошибок, не имеющие успеха, и выдает их, если в любом случае возвращается ошибка.Но на всякий случай я непосредственно проверял коды, возвращаемые Cloo OpenCL, и все они действительно указывают на «успех».
Кажется, не имеет значения, пробую ли я разные комбинации флагов и адресных пространств - одинсистема никогда не выбрасывает, одна система всегда выбрасывает.
Чего мне здесь не хватает?