如何在OpenCL中使用我的自定义结构?因为OpenCL中没有对象数组,或者图像旁边没有2D数组。
struct Block {
char item[4][4];
};
我想在OpenCL中使用这些结构的数组,并通过C / C ++中的索引访问它的元素。例如
Block *keys = new Block[11];
keys[3].item[2][2];
让我解释一下。我正在开发OpenCL中的AES-128 ECB。 Here is AES description.这些结构(块)我用于将明文分成4x4字节的块。这11个块的数组是每轮11个键。我用明文做了同样的事情。例如,67字节的明文被分成5个块。在C中,这在顺序执行(密钥调度,子字节,移位行,mixcolumns,addround)加密和解密方面非常有效。但问题是现在的问题并不像OpenCL那样简单。如何在OpenCL中使用这些块的数组?或者我是否需要将所有内容转换为一维char数组(例如)?
在OpenCL C和OpenCL C ++中,你不能在内核中动态分配内存 - 没有malloc
,只有位置new
等。你确实可以制作像char item[4][4]
这样的2D数组,并在你的内核中声明像Block
这样的结构。但是,如果必须具有动态大小的数组,则无法分配内存,那么您可以执行以下操作:
char item[100][100]
。clCreateBuffer
在主机上创建缓冲区并将其作为内核参数传递。如果你想在你的主机上构建一个结构数组,然后将它作为缓冲区传递给你的内核,你也可以这样做!但是必须在主机源和内核源中单独声明结构,并注意大小和对齐特性以及字节顺序。您可以确保在设备上正确解释从主机传入的位。
编辑:
要了解结构的布局,请看一下这个问题:C struct memory layout?
OpenCL C基于C,因此您可以期望结构的布局遵循相同的规则。原始类型的大小可能在您的主机和设备上有所不同,但OpenCL定义了几个类型的定义,例如cl_int
,在主机上声明结构时应该使用它,以确保它与您的设备上的大小相同。例如,主机上cl_int
的大小将与设备上的int
大小相同。
您可以使用param_name CL_DEVICE_ENDIAN_LITTLE
使用clGetDeviceInfo确定设备的字节序。