【问题标题】:Passing structure to openCL Kernel将结构传递给 openCL 内核
【发布时间】:2013-02-01 10:57:35
【问题描述】:

我想给opencl内核传递一个结构体,结构体是

struct test
{
    int *x;
    float *y;
    char *z;
};

而内存分配和初始化就像

    struct test t;
t.x = (int*)malloc(sizeof(int)*100);
t.y = (float*) malloc (sizeof(float)*50);
t.z = (char*) malloc (sizeof(char) *25);
  for(i = 0;i<100;i++)
  {
      t.x[i] = i;
      if(i<50)
          {
              t.y[i] = i;
          if(i<25)
              t.z[i] = 'a';
          }
  }

我可以将这样的结构传递给 opencl 内核吗

【问题讨论】:

  • 不要这样做。首先,它没有任何意义,其次,您的结构包含指针并且将毫无意义。更不用说不同的对齐方式和数据类型宽度了。如果你想通过结构,你肯定做错了什么,是时候重新考虑你的架构了。

标签: opencl pyopencl opencl.net


【解决方案1】:

可以传递这样的结构,但这将毫无意义,因为xyz 指向不同的内存区域。这些内存缓冲区中的每一个都必须单独传输。

【讨论】:

  • 是的,你是对的;它不仅没有意义,甚至不可能将这个结构作为一个单元传递,因为它们指向不同的内存位置。但是如果我有非常大的结构(意味着一个超过 10-15 个参数的结构)我仍然需要一个一个地传递它们还是有什么解决方案。
  • 不幸的是,内核使用的每个内存缓冲区都必须通过clSetKernelArg 显式设置。但是,也许,您可以进一步分解您的问题?
【解决方案2】:

最好在主机端分配内存并将它们作为内核参数发送给内核,而不是结构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多