编译你的内核
可以在目标设备上运行时编译内核。要做到这一点,你需要
- 内核源代码
- 要编译的目标设备
- 使用目标设备构建的上下文
快速术语更新:程序包含一组内核。你可以将程序视为完整的 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);