我目前正在使用VS2013。我创建了一个非常简单的C#解决方案,旨在将Cloo用于一个简单的类:
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
using System.IO;
using Cloo;
namespace ClooTest
{
class Test
{
public static void main_entry(byte[] args)
{
ComputePlatform platform = ComputePlatform.Platforms[0];
ComputeContext context = new ComputeContext(ComputeDeviceTypes.Gpu,
new ComputeContextPropertyList(platform), null, IntPtr.Zero);
ComputeCommandQueue queue = new ComputeCommandQueue(context,
context.Devices[0], ComputeCommandQueueFlags.None);
// get and build the source code
ComputeProgram program = new ComputeProgram(context, new string[] { kernelCode });
program.Build(null, null, null, IntPtr.Zero);
// pick the fucntion
ComputeKernel kernel = program.CreateKernel("add_data");
// create a ten integer array and its length
byte[] data1 = new byte[] { 1, 2, 3, 4, 5 };
byte[] data2 = new byte[] { 1, 2, 3, 4, 5 };
int size = data1.Length;
/* allocate memory */
ComputeBuffer<byte> data1buffer = new ComputeBuffer<byte>(context,
ComputeMemoryFlags.ReadWrite, data1);
ComputeBuffer<byte> data2buffer = new ComputeBuffer<byte>(context,
ComputeMemoryFlags.ReadWrite, data2);
kernel.SetMemoryArgument(0, data1buffer); // set the byte array
kernel.SetMemoryArgument(1, data2buffer); // set the byte array
kernel.SetValueArgument(2, size); // set third argument as size;
// execute
queue.ExecuteTask(kernel, null);
// wait for completion
queue.Finish();
// output results
for (int i = 0; i < size; i++)
Console.WriteLine(data1[i].ToString());
}
#region Kernels
private static string kernelCode = @"__kernel void add_data(__local char* data1, __local char* data2, __local int n)
{
data1[0]=data1[0]+data2[0];
}";
#endregion
}
}
虽然我在Visual Studio中构建解决方案没有问题,但我仍然收到“检测到 OpenCL错误代码:BuildProgramFailure ”。尝试使用“ program.Build(null,null,null,IntPtr.Zero)”构建程序时。内核代码看起来很好,但我现在已经在这几个晚上,似乎无法弄清楚发生了什么。你可能会说我对Cloo很新,我从网上的例子中得到了一些想法,但我可能在一个非常简单的层面做错了。任何建议都会很棒。
我已经为我的显卡下载了所有最新的OpenCL驱动程序。
谢谢
答案 0 :(得分:1)
您应该检查来自program.Build
的错误返回码(如果它返回一个;我不知道您的框架包含OpenCL API)。
要获得有关构建失败原因的更多详细信息,您需要调用框架clGetProgramBuildInfo
放置的任何内容,cl_program_build_info
参数设置为CL_PROGRAM_BUILD_LOG
。这将告诉你编译错误是什么以及它发生了什么行。
只是猜测错误:
我认为__local int n
是对的,它应该是int n
。
我认为__local char* data1, __local char* data2
也不正确;这些应该是__global char* data1, __global char* data2
(本地记忆是一个高级主题)。
答案 1 :(得分:0)
要获取特定的内核错误,应尝试捕获程序。构建并调用GetBuildLog。 像这样:
try{
program.Build(null, null, null, IntPtr.Zero);
}
catch (Exception ex)
{
String buildLog = program.GetBuildLog(context.Devices[0]);
Console.WriteLine("\n********** Build Log **********\n" + buildLog + "\n*************************");
}