【问题标题】:OpenCL: maintaining separate version of kernelsOpenCL:维护单独版本的内核
【发布时间】:2014-10-17 05:04:10
【问题描述】:

Intel SDK 说:

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

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

【问题讨论】:

    标签: opencl


    【解决方案1】:

    为 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, ...);
    

    (注意:我暂时无法测试,如果有问题,我会删除这个答案)

    【讨论】:

      【解决方案2】:

      clCreateKernel 创建程序的入口点,并且该程序已经针对特定设备(CPU 或 GPU)进行了编译。因此,如果程序已经以一种或另一种方式编译,则在创建内核级别无能为力。

      通过传递不同的编译程序对象,clCreateKernel 将为不同的设备创建不同的内核对象。

      控制 GPU/CPU 模式的关键在于clBuildProgram 步骤,其中必须指定设备。 此外,可以使用外部定义进一步完善编译,以禁用/启用专门为 CPU/GPU 设计的代码。

      【讨论】:

        【解决方案3】:

        您将只创建具有相同名称的内核。要区分设备,您将使用#ifdef 查询inside 内核,即:

        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。备注:-D... 不是错字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-28
          • 2011-12-06
          • 1970-01-01
          • 2017-11-05
          相关资源
          最近更新 更多