0

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

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 不同,但如何同步呢?

4

1 回答 1

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).

于 2018-08-24T19:56:56.363 回答