如果您需要单独版本的内核,请保留源代码的一种方法 代码库相同,是使用预处理器来创建CPU特定的或 GPU特有的内核优化版本。你可以跑 clBuildProgram在同一程序对象上两次,一次用于CPU 一些标志(编译器输入)指示CPU版本,第二次 用于GPU和相应的编译器标志。然后,当你创建两个 内核使用clCreateKernel,运行时有两个不同的版本 对于每个内核。
我们假设我使用clBuildProgram
两次使用CPU和GPU标志。这将编译两个版本的程序,一个针对CPU优化,另一个针对GPU优化。但是我现在如何创建两个内核,因为clCreateKernel()
中没有特定于CPU / GPU的选项?
答案 0 :(得分:0)
为CPU和GPU设备构建内核并获取不同内核的调用顺序可能如下所示:
cl_program program = clCreateProgramWithSource(...)
clBuildProgram(program, numCpuDevices, cpuDeviceList, cpuOptions, NULL, NULL);
cl_kernel cpuKernel = clCreateKernel(program, ...);
clBuildProgram(program, numGpuDevices, gpuDeviceList, gpuOptions, NULL, NULL);
cl_kernel gpuKernel = clCreateKernel(program, ...);
(注意:此刻我无法测试。如果出现问题,我将删除此答案)
答案 1 :(得分:0)
您只能创建具有相同名称的内核。要区分设备,您可以在内核中使用<{1}}查询 :
#ifdef
您可以通过
获取此标志kernel void foo(global float *bar)
{
#ifdef HAVE_CPU
bar[0] = 23.0;
#elif HAVE_GPU
bar[0] = 42.0;
#endif
}
或program.build({device}, "-DHAVE_CPU")
。备注:-DHAVE_GPU
不是拼写错误。
答案 2 :(得分:0)
clCreateKernel
创建程序的入口点,并且已经为特定设备(CPU或GPU)编译了该程序。因此,如果程序已经以一种或另一种方式编译,那么在创建内核级别就没有什么可以做的。
通过传递不同的编译程序对象,clCreateKernel
将为不同的设备创建不同的内核对象。
控制GPU / CPU模式的关键是clBuildProgram
步骤,必须指定设备。
此外,可以使用外部定义进一步细化编译,以禁用/启用专为CPU / GPU设计的代码片段。