【问题标题】:Accessing structured data following a struct in OpenCL在 OpenCL 中按照结构访问结构化数据
【发布时间】:2021-03-03 05:15:18
【问题描述】:

总结:OpenCL 是否允许在内核函数中从指向结构的指针和指向同一内存块中结构之后数据的字节偏移量创建指针?

我试图更好地理解 OpenCL 在指针和结构方面的局限性。我目前正在进行的一个项目涉及处理不同类型的信号节点,从一个处理实例到下一个处理实例,这些节点的状态数据大小可能大不相同。我首先从 Linux CPU 低延迟 SCHED FIFO 实现开始,因此在处理线程中没有内存分配或系统调用,但试图为最终的 OpenCL 实现做计划。

考虑到这一点,我开始设计算法以将所有状态数据分配为一个块,该块以一个结构开始,并附加了额外的数据结构和数组,注意数据类型的正确对齐。结构中的整数偏移字段指示缓冲区中附加数据的字节位置。所以从技术上讲,结构中没有任何指针在将数据从主机传递到设备时可能不起作用。然而,状态数据的最终大小将在一个合成节点与下一个合成节点之间有所不同,尽管一旦它们被分配,大小不会改变。我不确定这是否违反了 OpenCL 的“无可变长度结构”规则。

简单示例(伪 OpenCL 代码):

// Additional data following Node structure:
// cl_float fArray[fArrayLen];
// cl_uint iArray[iArrayLen];
typedef struct
{
  cl_float val1;
  cl_float val2;
  cl_uint fArrayOfs;
  cl_uint fArrayLen;
  cl_uint iArrayOfs;
  cl_uint iArrayLen;
  ...
} Node;

void
node_process (__global Node *node)
{
  __global cl_float *fArray;
  __global cl_uint *iArray;

  // Construct pointers to arrays following Node structure
  fArray = ((cl_uchar *)node) + node->fArrayOfs;
  iArray = ((cl_uchar *)node) + node->iArrayOfs;
  ...
}

如果这是不可能的,是否有人对定义复杂的数据结构有任何建议,这些数据结构本质上是动态的,而无需传递数十个指向内核函数的指针?动态性质仅在它们被分配时,而不是在内核处理时。我能想到的唯一其他选择是将处理节点状态定义为联合,并将额外的数据结构作为参数传递给内核函数,但这很可能会变成大量的函数参数。或者也许允许带有指针的 __local 结构?

【问题讨论】:

    标签: pointers struct opencl


    【解决方案1】:

    是的,这在 OpenCL 中是允许的(只要您遵守对齐规则,正如您所提到的),但是您需要非常小心:

    首先,

    fArray = ((cl_uchar *)node) + node->fArrayOfs;
               ^^^^^^^^^^
    

    您在这里错过了内存类型,请确保您包含 __global 或默认为 (IIRC) __private,这会将您直接带到未定义行为的领域。一般来说,我建议明确所有指针声明和类型的内存类型,因为默认值通常不明显。

    其次,如果您打算在 GPU 上运行此程序,如果相邻工作项的控制流和内存访问模式非常不同,那么从性能方面来说,您的处境很糟糕。我建议您在构建拆分工作和设计数据结构的方式之前阅读 GPU 供应商的 OpenCL 性能优化指南。

    【讨论】:

    • 感谢您提供的有用信息。我仍然不确定这个应用程序是否会在 GPU 上运行良好,或者 OpenCL 是否是一个很好的用例。我很难弄清楚如何拆分工作。它是一个具有延迟要求(至少低于 5ms)的音频合成器。每个“声音”实例代表一个 MIDI 事件,例如音符按下。语音合成基于信号处理的依赖树。每个“节点”处理一个包含 64 个样本的块。目前,我计划将每个声音视为具有 1 个项目的单个工作组,而不是尝试合成单个样本。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多