将结构体数组传递给OpenCL内核

3

你好,我正在尝试在OpenCL中实现距离向量程序。

基本上,我在将结构体数组作为参数传递到内核时遇到了问题。

我的结构体定义如下:

    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; } "\   */
        //" } "\  

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

当我运行这个程序时,它会显示“节点类型未定义”...我需要记住其他参数吗?我应该做哪些更改?如果有人能够给我一个简单的代码示例来说明结构传递到内核中的过程,那将非常感激。谢谢 :)

不要这样做。你不能传递结构体。应该使用普通数组代替。 - SK-logic
@SK-logic 我尝试使用3D数组作为数据结构,但它显示堆栈对齐问题或类似的错误,因此我无法这样做。你能否建议我使用其他数据结构来存储我在节点定义中定义的节点? - abhishek b
1
尝试使用一个平坦的数组,相应地重新计算索引。 - SK-logic
1个回答

10
你需要在内核中提供结构定义。编译你的内核的编译器并不会神奇地知道在你的C代码中定义的类型。当你把内核存储在一个单独的文件中时,这一点更加明显,而不是将它保存为主程序中的一个巨大字符串。
你的内核源代码应该像这样:
typedef struct {
    int a[nodes][4];
} node;

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

如果我传入一个数组x,我该如何索引x? - Raaj
建议将内核源代码保留在单独的文件中,这样做是明智的。除非是非常简短的包装器,否则在C源代码实践中使用字符串会让人感到不适。 - Slava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接