OpenCL:维护单独版本的内核

时间:2014-08-23 13:16:06

标签: opencl

Intel SDK说:

  

如果您需要单独版本的内核,请保留源代码的一种方法   代码库相同,是使用预处理器来创建CPU特定的或   GPU特有的内核优化版本。你可以跑   clBuildProgram在同一程序对象上两次,一次用于CPU   一些标志(编译器输入)指示CPU版本,第二次   用于GPU和相应的编译器标志。然后,当你创建两个   内核使用clCreateKernel,运行时有两个不同的版本   对于每个内核。

我们假设我使用clBuildProgram两次使用CPU和GPU标志。这将编译两个版本的程序,一个针对CPU优化,另一个针对GPU优化。但是我现在如何创建两个内核,因为clCreateKernel()中没有特定于CPU / GPU的选项?

3 个答案:

答案 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设计的代码片段。