opencl吧 关注:530贴子:1,575
  • 28回复贴,共1

请问Opencl如何传递结构体数据到内核函数啊

只看楼主收藏回复

如题,Opencl如何把结构体数组数据导入到内核函数呢?请大神们帮帮忙啊,最好能给段示例代码


IP属地:重庆1楼2013-09-09 20:53回复
    kernel内外声明一样的结构体,然后结构体就和普通类型一样了


    2楼2013-09-13 16:32
    收起回复
      大哥 我在测试传递结构体,这是内核函数源码:
      #include "stdafx.h"
      #define szz 10
      typedef struct
      {
      double x;
      double y;
      double z;
      } vector3; //三维向量结构体
      typedef struct
      {
      vector3 a[szz];
      vector3 b[szz];
      } ceshi;
      __kernel void hello(__global ceshi* buf1)
      {
      }
      但是编译报错,不知道问题错在哪里了I


      IP属地:重庆3楼2013-09-15 13:45
      回复
        int err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); if (err != CL_SUCCESS) { size_t len; char buffer[2048]; printf("Error: Failed to build program executable!\n"); clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); printf("%s\n", buffer); exit(1); }
        这段代码可以获得kernel中的错误。I


        5楼2013-09-15 14:05
        收起回复
          #define szz 10 typedef struct
          {
          float x;
          float y;
          float z;
          }vector3;
          typedef struct
          {
          vector3 a[szz];
          vector3 b[szz];
          }ceshi;
          __kernel void hello(__global ceshi *buf1,
          __global ceshi *buf)
          {
          for(int i=0;i<szz;++i)
          {
          buf.a[i].x=buf1.a[i].x+buf1.b[i].x;
          }
          }
          编译后提示我 buf.a[i].x 、buf1.a[i].x、buf1.b[i].x表达式必须是结构体或者联合类型
          但是我已经定义了buf和buf1为ceshi结构体了呀,怎么会这样呢?
          结构体都是一样的
          主机的内存设置代码为
          cl_mem clbuf = clCreateBuffer(context,
          CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
          sizeof(ceshi),
          &buf1,
          NULL );
          cl_mem buf = clCreateBuffer( context,
          CL_MEM_WRITE_ONLY,
          sizeof(ceshi),
          NULL, NULL );
          主机内核变量设置代码为
          clSetKernelArg(kernel, 0, sizeof(cl_mem), (void*) &clbuf);
          clSetKernelArg(kernel, 1, sizeof(cl_mem), (void*) &buf);
          请大哥帮忙看看哪里错了呢
          I


          IP属地:重庆7楼2013-09-15 22:15
          回复
            好吧 内核函数的指针用错了,现在数据已经成功传递进去了,谢谢大哥的指点


            IP属地:重庆8楼2013-09-16 21:08
            收起回复
              如果我想给内核函数传一个Mat对象,怎么传,总是报语法错误


              9楼2018-05-23 15:57
              回复
                转换为void* 长度是sizeof(structname) 很简单啊


                10楼2021-11-16 17:34
                回复