在打开的CL中将结构数组传递给内核

时间:2011-12-16 09:53:45

标签: parameters struct opencl

嗨我正试图在开放CL中实现距离矢量程序..

基本上我遇到了将结构数组作为参数传递给内核的问题。

我的结构定义是这个

    typedef struct 
    {
    int a[nodes][4];
    }node;
    node * srcA;

为此分配内存后,我已使用此代码将其捆绑到缓冲区对象中

         // allocate the buffer memory objects
    memobjs1 = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,           
         sizeof(node) * n, srcA, NULL);

if (memobjs1 == (cl_mem)0)
{
    printf("ERROR: Failed to create Buffer...mem[0]\n");
    clReleaseCommandQueue(cmd_queue);
    clReleaseContext(context);
    return -1;
}

我的内核参数设置如下

    err = clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *) &memobjs1);

现在我想将这个结构数组(即srcA指向)传递给内核 我这样做了..

    const char *ocl_test_programs[] = {\
              "__kernel void disvec (__global node *x,__global int *p)"\
          "{"\
         "int i=1,r=1,n;"\
          "r=p[1]; "\
          "n=p[0];"\

          //"for(i=1;i<=n;i++) "\

         "{"\

          "if(x[r].a[i][2]!=999 && x[r].a[i][2]!=0)"\

         "{"\

      "int j = get_global_id(0); "\

        /*  "int k=x[r].a[i][2] + x[i].a[j][2];"\
            "if(x[r].a[j][2]>k)"\
        "{ "\

            "   x[r].a[j][2] = k;"\
            "x[r].a[j][3] = i; } "\   */
        //" } "\  

     " } "\
    " } "\
    " } "
    };

当我运行这个程序时,它说节点类型没有定义...我是否必须记住一些其他参数传递?有什么变化让我不屑一顾.. ??如果有人能够至少给我一个简单的代码来说明结构传递到内核中的一个简单的例子,将非常感谢..非常感谢:)

1 个答案:

答案 0 :(得分:10)

您还需要在内核中提供结构定义。编译内核的编译器并不神奇地了解C代码中定义的类型。当你将内核保存在一个单独的文件中时,这一点就更加明显了,而不是将它作为一个巨大的字符串保存在你的&#34; main&#34;程序

您的内核源代码如下:

typedef struct {
    int a[nodes][4];
} node;

kernel void disvec (global node *x, global int *p) {
    /* you kernel code here */
};