Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 在OpenCL中按照结构访问结构化数据_Pointers_Struct_Opencl - Fatal编程技术网

Pointers 在OpenCL中按照结构访问结构化数据

Pointers 在OpenCL中按照结构访问结构化数据,pointers,struct,opencl,Pointers,Struct,Opencl,概要:OpenCL是否允许在内核函数中从指向结构的指针和指向同一内存块中结构后的数据的字节偏移量创建指针 我试图更好地理解OpenCL在指针和结构方面的局限性。我目前正在从事的一个项目涉及不同类型的信号节点的处理,这些节点在不同的处理实例之间可能具有大小完全不同的状态数据。我首先从LinuxCPU低延迟SchedFIFO实现开始,因此在处理线程时没有内存分配或系统调用,但尝试计划最终的OpenCL实现 考虑到这一点,我开始设计将所有状态数据分配为一个块的算法,该块从一个结构开始,并附加了额外的数

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

我试图更好地理解OpenCL在指针和结构方面的局限性。我目前正在从事的一个项目涉及不同类型的信号节点的处理,这些节点在不同的处理实例之间可能具有大小完全不同的状态数据。我首先从LinuxCPU低延迟SchedFIFO实现开始,因此在处理线程时没有内存分配或系统调用,但尝试计划最终的OpenCL实现

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

简单示例(伪OpenCL代码):


如果这是不可能的,那么有人对定义复杂的数据结构有什么建议吗?这些数据结构本质上是动态的,而不需要向内核函数传递几十个指针?动态特性仅在分配它们时才存在,而不是在内核进行处理时。我能想到的唯一其他选择是将处理节点状态定义为一个联合,并将额外的数据结构作为参数传递给内核函数,但这可能会转化为大量的函数参数。或者可能允许使用带有指针的本地结构?

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

首先,

fArray = ((cl_uchar *)node) + node->fArrayOfs;
           ^^^^^^^^^^
您错过了此处的内存类型,请确保包含
\uuuu global
或默认为(IIRC)
\uuuu private
,这将直接带您进入未定义行为的领域。一般来说,我建议对所有指针声明和类型显式说明内存类型,因为默认值通常不明显


第二,如果您计划在GPU上运行此功能,如果相邻工作项的控制流和内存访问模式非常不同,那么从性能角度来看,您将处于一个糟糕的时期。我建议您在设计拆分工作和设计数据结构的方式之前,先阅读GPU供应商的OpenCL性能优化指南。

感谢您提供的有用信息。我仍然不确定这个应用程序是否能在GPU上运行良好,或者OpenCL是否是一个很好的用例。我很难弄清楚如何分割这项工作。它是一种具有延迟要求(至少低于5ms)的音频合成器。每个“voice”实例代表一个MIDI事件,例如按键时的音符。语音合成基于信号处理的依赖树。每个“节点”处理64个样本的块。目前,我计划将每个声音作为一个单独的工作组处理一个项目,而不是尝试合成单个样本。
fArray = ((cl_uchar *)node) + node->fArrayOfs;
           ^^^^^^^^^^