编译你的内核

可以在目标设备上运行时编译内核。要做到这一点,你需要

  • 内核源代码
  • 要编译的目标设备
  • 使用目标设备构建的上下文

快速术语更新:程序包含一组内核。你可以将程序视为完整的 C / C++ / C#源文件,而内核是该文件的不同功能成员。

首先,你需要使用源代码创建程序。

var program = Cl.CreateProgramWithSource(_context, 1, new[] { source }, null, out err);

你可以将多个源文件合并到一个程序中并将它们一起编译,这样你就可以将内核放在不同的文件中并一次编译它们。

在下一步中,你需要在目标设备上编译程序。

err = Cl.BuildProgram(program, 1, new[] { _device }, string.Empty, null, IntPtr.Zero);

现在有一点需要注意:错误代码只告诉你,函数调用本身是否成功,而不是你的代码是否实际编译。为了验证这一点,我们必须查询一些其他信息

BuildStatus status;
status = Cl.GetProgramBuildInfo(program, _device, ProgramBuildInfo.Status, out err).CastTo<BuildStatus>();
if (status != BuildStatus.Success) {
    var log = Cl.GetProgramBuildInfo(program, _device, ProgramBuildInfo.Log, out err);
}

C / C++人员可以忽略最后的强制转换,只是将返回的整数与相应的常量进行比较。

第一个调用检查我们的构建是否真的成功。如果没有,我们可以检索日志并确切地看到出错的地方。请参阅有关不同平台的一些常见陷阱的评论。

构建程序后,需要从编译的程序中提取不同的内核。为此,你可以使用创建内核

_kernel = Cl.CreateKernel(_program, kernel, out err);

其中’kernel’是内核名称的字符串。完成内核后,需要将其发布

Cl.ReleaseKernel(_kernel);