【问题标题】:How to assign pointer to element of array of some struct in this array(OpenCL)?如何将指针分配给此数组(OpenCL)中某个结构的数组元素?
【发布时间】:2015-08-27 15:14:26
【问题描述】:

也许你可以告诉我如何在 OpenCL 中创建层次结构。如果您有“new”或“malloc”,这很容易,但我不知道如何在 GPGPU 中做到这一点。所以我创建了 3 个内核:

  1. 将 sizeof 结构发送到主机。
  2. 初始化数据。
  3. 以及使用在第二个内核中初始化的数据的内核。

我在 OpenCL 中有这个结构:

    typedef struct some some;
struct some{
    char data[4];
    some* children[8];
};

第一个内核说这个结构的大小是 36 个字节(4 个用于数据,32 个用于指针)。

接下来我根据之前的信息在GPU上分配内存并调用第二个内核:

kernel void import(global some *buffer){
for(int i=0;i<4;i++){
buffer[0].data[i]=255; //For example, doesn't matter
}
//Now I need to assign pointer to next element of array(buffer) to first element
buffer[0].children[0]=&buffer[1];
}

但内核无法编译。我也试过了:

*buffer[0].children[0]=buffer[0];

它可以编译,但当然会崩溃。这在逻辑上是错误的)没有指针分配一切正常。 1 个元素的非常酷的程序)

【问题讨论】:

    标签: c arrays struct opencl gpgpu


    【解决方案1】:

    尝试使用偏移量或数组索引而不是指针。

    typedef struct some some; struct some{ char data[4]; size_t children[8]; // an array of subscripts };

    ...

    // buffer[0].children[0]=&buffer[1]; becomes buffer[0].children[0] = 1;

    所以现在你可以通过它的下标引用一个孩子

    buffer[ buffer[0].children[0] ].char[0]
    

    【讨论】:

    • 如果多个线程可以通过设置孩子的值来创建链接,为了确保一致性,您需要使用原子操作。
    【解决方案2】:

    如果您的设备支持 OpenCL 2.0,那么您可以使用 Shared Virtual Memory。在主机上创建的指针也将在设备上有效。

    Shared Virtual Memory 概念的描述以及您可以找到herehere 的示例。

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      • 2012-09-16
      • 2019-12-17
      相关资源
      最近更新 更多