【问题标题】:Passing C structures to OpenCL kernel将 C 结构传递给 OpenCL 内核
【发布时间】:2018-08-25 16:32:43
【问题描述】:

我的宿主程序中有下一个结构:

typedef struct  s_figure
{
    cl_float        reflection;
    cl_int          color;
    enum e_figure   type;
    cl_float3       vector1;
    cl_float3       vector2;
    cl_float        param1;
    cl_float        param2;
}                       t_figure;

我的内核中有下一个结构:

typedef struct          s_figure
{
    float       reflection;
    int         color;
    enum e_figure   type;
    float3      vector1;
    float3      vector2;
    float       param1;
    float       param2;
}                       t_figure;

你也可以看到它的枚举:

enum            e_figure
{
    BadFigure = -1,
    InfinitePlane = 0,
    Sphere = 1,
    InfiniteCylinder = 2,
    InfiniteCone = 3
};

以这种方式将数据传递给 OpenCL 内核时(其中图形是正确解析的结构数组):

buf_figures = clCreateBuffer(context, CL_MEM_USE_HOST_PTR, sizeof(t_figure) * figures_count, figures, &err);
clEnqueueWriteBuffer(view->cl->queue, buf_figures, CL_TRUE, 0,sizeof(t_figure) * figures_count, figures, 0, NULL, NULL);

我有一个数据失真的问题,例如将数据传输到 OpenCL 内核后的颜色可以更改为非常不同的 (0xFFFFFF->0x007FC2)。光线追踪算法在每个程序执行时都以另一种方式工作。我该如何解决?我认为 gcc 编译器制作结构的方式与 openclc 不同,但如何同步呢?

【问题讨论】:

  • cl_int 是 32 位的,系统 int 可以是 32 或 64。将颜色设置为 int32_t
  • 第二种结构是opencl结构。是不是 int 和 cl_int 不兼容?
  • THIS 可能有帮助,也可能没有帮助。看看吧。
  • 如您所见,我的结构没有指针
  • 这可能会有所帮助,从第 197 页开始的第 6/1 节以及第 203 页的第 6.1.5 节类型对齐khronos.org/registry/OpenCL/specs/opencl-1.2.pdf

标签: c opencl opencl-c


【解决方案1】:

您需要为主机和设备的结构声明指定__attribute__ ((packed))。否则,不同的编译器(主机编译器和设备编译器)可能会为结构创建不同的内存布局。

编辑:鉴于sizeof(t_figure) 在主机和设备上都是 52,那么 根本原因可能与结构无关。

由于您使用 CL_MEM_USE_HOST_PTR 创建缓冲区,因此有一些 您需要考虑的注意事项:

  1. figures 使用 CL_MEM_USE_HOST_PTR 指定的指针 缓冲区处于活动状态时必须指向有效内存,因为它 实际上是用作 cl_mem 对象的底层内存存储。

  2. 使用CL_MEM_USE_HOST_PTR 创建的缓冲区已使用内存 (或它的副本)由figures 指向,因此后续写入 clEnqueueWriteBuffer 在这里是多余的。更重要的是, 我什至不确定clEnqueueWriteBuffer 在这方面的表现如何 例,因为这个操作本质上是一个memcpy(figures,figures, size)

【讨论】:

  • 我已经为两个结构声明都指定了它,但是在那个程序之后做同样的事情。
  • 由于所有内核执行没有任何函数来改变图形数据,但它不像在主机程序中。
  • @AndrewButok,你能检查sizeof(t_figure) 并在主机和设备上使用printf 转储其内容吗?
  • 两者都是52字节
  • 我更新了我的答案以反映另一个可能的根本原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
相关资源
最近更新 更多