【问题标题】:OpenCL: using struct as kernel argumentOpenCL:使用结构作为内核参数
【发布时间】:2015-10-17 01:10:20
【问题描述】:

我可以使用 struct 作为 OpenCL 内核参数吗?

我想在 NVIDIA OpenCL 1.2(NVIDIA 驱动程序 352.39)中使用结构类型作为 OpenCL 内核参数

我试过了,但它会导致 CL_OUT_OF_RESOURCE 错误。

我的代码有什么问题??

[用于结构定义]

/* struct type definition */
typedef struct _st_foo
{
    int aaa;
    int bbb;
     .....
    int zzz;
}st_foo;      // st_foo doesn't have any pointer members

[主机代码]

/* OpenCL initalize... */

st_foo stVar;

cl_mem cm_buffer;
cm_buffer = clCreateBuffer(cxContext, CL_MEM_READ_ONLY, sizeof(st_foo), NULL, NULL);
clSetKernelArg(ckKernel, 0, sizeof(cl_mem), (void*)&cm_buffer);
clEnqueueWriteBuffer(cqueue, cm_buffer, CL_TRUE, 0, sizeof(st_foo), &stVar, 0, NULL, NULL);

[内核代码]

__kernel void testfunction(__global const st_foo *stVar)
{
    printf("stVar->aaa=%d\n", stVar->aaa);
}

【问题讨论】:

    标签: opencl


    【解决方案1】:

    如果您不使用 OpenCL 数据类型,则在 OpenCL 中声明结构是不安全的。此外,对齐可能是一个问题,请在主机/设备编译器中强制数据包对齐。

    你应该将你的结构声明为:

    [主机]

    typedef struct __attribute__ ((packed)) _st_foo
    {
        cl_int aaa;
        cl_int bbb;
         .....
        cl_int zzz;
    }st_foo;
    

    [设备]

    typedef struct __attribute__ ((packed)) _st_foo
    {
        int aaa;
        int bbb;
         .....
        int zzz;
    };
    

    此外,如果您只需要一个参数,而不是结构数组,那么只需将其传递为:

    clSetKernelArg(ckKernel, 0, sizeof(mystruct), mystruct);
    

    【讨论】:

    • 我尝试将结构作为非指针值传递,但无法构建内核。您是否允许某些静态对象作为内核参数?
    • 不是缓冲区的内核参数(即:非指针、整数、结构等),可以直接作为参数传递。只要设备中有足够的可用常量内存来保持该结构。
    猜你喜欢
    • 2012-04-20
    • 2016-05-28
    • 2012-02-05
    • 2012-04-27
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多