如何在OpenCL中使用struct

问题描述 投票:1回答:1

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

c++ c opencl
1个回答
1
投票

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

  1. 声明一个足够大的自动存储持续时间的数组(任何维度)供您使用。例如,如果您知道不需要超过100x100的数组,则声明char item[100][100]
  2. 使用clCreateBuffer在主机上创建缓冲区并将其作为内核参数传递。

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

编辑:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.