【问题标题】:cl_float4 on host and float4 on device in openCLopenCL 中主机上的 cl_float4 和设备上的 float4
【发布时间】:2014-12-11 13:08:26
【问题描述】:

所以我想在 openCL 中定义一个可在主机和设备上使用的结构,它使用内置的 openCL float4 数据类型。

在主机端,框架带有 cl_float4 类型,但在设备上它只是 float4。

所以如果我创建一个这样的结构......

typedef struct
{
   cl_float4 a, b;
} MyStruct;

...然后尝试将该结构传递到内核(通过缓冲区)我得到一个错误。

如果我声明如下...

typedef struct 
{
    float4 a,b;
}

...这可以在设备上运行,但在主机上不起作用。

那么有没有办法获得它,以便我可以在同一结构内的程序两侧使用内置向量类型的 openCL?

【问题讨论】:

    标签: arrays vector struct kernel opencl


    【解决方案1】:

    C 预处理器可以在这方面为您提供帮助,通过根据代码是在主机还是设备上编译来区别对待代码。

    这里有一些可能的解决方案:


    typedef struct
    {
    #ifdef __OPENCL_C_VERSION__
       float4
    #else
       cl_float4
    #endif
          a, b;
    } MyStruct;
    

    或:

    #ifdef __OPENCL_C_VERSION__
    typedef float4 cl_float4;
    #endif
    
    typedef struct
    {
       cl_float4 a, b;
    } MyStruct;
    

    或:

    #ifndef __OPENCL_C_VERSION__
    typedef cl_float4 float4;
    #endif
    
    typedef struct
    {
       float4 a, b;
    } MyStruct;
    

    或者直接使用cl_float4,像这样编译OpenCL代码:

    clBuildProgram(program, 1, &device, "-Dcl_float4=float4", NULL, NULL);
    

    【讨论】:

    • OPEN_CL_C_VERSION 宏似乎不起作用。我的结构在我使用 clCreateProgramWithSource 传递到 clProgram 的 .h 文件中声明。当我包含“#ifndef OPENCL_C_VERSION typedef cl_float4 float4 #endif”时,我的内核代码(.cl 文件)会产生一个编译器错误,指出它无法识别 cl_float4,这很奇怪,因为因为我放入了宏,所以它应该甚至没有看到。 __OPENCL_C_VERSION 不是通用宏吗?在 clBuildProgram 中尝试编译器标志也不起作用。
    • 是的,__OPENCL_C_VERSION__ 绝对应该由每个 OpenCL 编译器定义。您使用的是哪个平台/设备?
    • 我使用的是 macbook pro。英特尔 CPU、英特尔高清显卡 4000 GPU 和 Nvidia GeForce GT 650m GPU。使用 openCL 1.2 版,我正在 Xcode 上构建。
    • 您是否尝试过彻底清理和重建?有时已编译的 OpenCL 内核会被缓存,因此当您仅更改头文件中的代码或编译器选项时,不会重新编译 OpenCL 代码。
    • 是的,我尝试清理、删除所有派生数据并重新构建。我认为部分问题是在 ifndef 中我还必须添加 #include 否则主机将无法识别 cl_float4 类型。但是,当我尝试访问内核端的 float4 时,我收到一条错误消息,指出内核找不到 。我觉得这无关紧要,因为它在#ifndef 块内。
    【解决方案2】:

    除非您对结构定义非常小心,否则我会避免使用这种方法。您的 OpenCL 设备架构的数据结构对齐规则可能与您的 OpenCL 主机架构的数据结构对齐规则大不相同。有关数据结构对齐的概述,请参阅this Wikipedia article

    TLDR:结构的大小可能因设备而异,每个结构的成员与结构开头的偏移量也可能不同。如果发生这种情况,您的程序将中断。即使您在当前的主机/设备组合上解决了这个问题,也不能保证在其他硬件组合上也能正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多