gpt4 book ai didi

parameters - 在开放的 CL 中将结构数组传递给内核

转载 作者:行者123 更新时间:2023-12-03 09:35:16 27 4
gpt4 key购买 nike

嗨,我正在尝试在开放的 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; } "\ */
//" } "\

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

当我运行这个程序时,它说节点类型未定义......我是否必须记住一些其他参数才能传递?我做了什么改变.. ??如果有人可以至少给我一个简单的代码,用一个简单的例子来说明结构传递到内核,那将不胜感激..非常感谢:)

最佳答案

您还需要在内核中提供结构定义。编译内核的编译器不会神奇地知道 C 代码中定义的类型。当您将内核保存在一个单独的文件中而不是将其作为一个巨大的字符串保存在“主”程序中时,这一点会更加明显。

您的内核源代码如下所示:

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

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

关于parameters - 在开放的 CL 中将结构数组传递给内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8532441/

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