如何在OpenCL中使用struct

时间:2018-03-01 18:04:52

标签: c++ c opencl

如何在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的一维数组(例如)?

1 个答案:

答案 0 :(得分:1)

在OpenCL C和OpenCL C ++中,您无法在内核中动态分配内存 -  没有malloc,只有展示位置new等。您确实可以创建像char item[4][4]这样的2D数组,并在内核中声明像Block这样的结构。但是,如果必须具有动态大小的数组,则无法分配内存,那么您可以执行以下操作:

  1. 声明一个足够大的自动存储持续时间的数组(任何维度)供您使用。例如,如果您知道不需要超过100x100阵列,则声明char item[100][100]

  2. 使用clCreateBuffer在主机上创建一个缓冲区,并将其作为内核参数传递。

  3. 如果你想在你的主机上构建一个结构数组,然后将它作为缓冲区传递给你的内核,你也可以这样做!但是必须在主机源和内核源中单独声明结构,并注意大小和对齐特性以及字节顺序。您可以确保在设备上正确解释从主机传入的位。

    编辑:

    要了解结构的布局,请查看以下问题:C struct memory layout?

    OpenCL C基于C,因此您可以期望结构的布局遵循相同的规则。原始类型的大小可能在您的主机和设备上有所不同,但OpenCL定义了几个类型定义,如cl_int,您可能在主机上声明结构时使用它,以确保它与您的设备上的大小相同。例如,您主机上cl_int的尺寸与设备上int的尺寸相同。

    您可以使用 param_name CL_DEVICE_ENDIAN_LITTLE使用clGetDeviceInfo确定设备的字节顺序。

相关问题