gpt4 book ai didi

c - 将 C 结构传递给 OpenCL 内核

转载 作者:行者123 更新时间:2023-11-30 14:46:44 24 4
gpt4 key购买 nike

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

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 不同的方式创建结构,但如何同步它?

最佳答案

您需要为主机和设备的结构声明指定__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)

关于c - 将 C 结构传递给 OpenCL 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52009087/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com