opencl - 在 Opencl 中为结构中的动态数组分配内存对象

标签 opencl gpgpu gpu

我在 C 中创建了以下结构“数据”

typedef struct data
{
  double *dattr;                           
  int d_id;                                
  int bestCent;                            
}Data;

'dattr' 是上述结构中的一个数组,它保持动态。
假设我必须创建上述结构的 10 个对象。 IE。
dataNode = (Data *)malloc (sizeof(Data) * 10);

对于此结构的每个对象,我必须使用以下命令重新分配 C 中的内存以用于数组 'dattr':
for(i=0; i<10; i++)
   dataNode[i].dattr = (double *)malloc(sizeof(double) * 3);

应该怎么做才能在 OpenCL 中实现相同的功能?为结构对象分配内存后,如何为数组“dattr”分配内存?

最佳答案

OpenCL 设备(例如,GPU)中的内存分配必须在主机线程中使用 clCreateBuffer 执行(或者 clCreateImage2D/3D 如果你想使用纹理内存)。这些函数允许您自动将主机数据(例如使用 malloc 创建)复制到设备,但我通常更喜欢显式使用 clEnqueueWriteBuffer/clEnqueueMapBuffer (或 clEnqueueWriteImage/clEnqueueMapImage 如果使用纹理内存),以便我可以分析数据传输。下面是一个例子:

#define DATA_SIZE 1000

typedef struct data {
    cl_uint id;
    cl_uint x;
    cl_uint y;
} Data;

...

// Allocate data array in host
size_t dataSizeInBytes = DATA_SIZE * sizeof(Data);
DATA * dataArrayHost = (DATA *) malloc(dataSizeInBytes);

// Initialize data
...

// Create data array in device
cl_mem dataArrayDevice = clCreateBuffer(context, CL_MEM_READ_ONLY, dataSizeInBytes, NULL, &status );

// Copy data array to device
status = clEnqueueWriteBuffer(queue, dataArrayDevice, CL_TRUE, 0, dataSizeInBytes, &dataArrayHost, 0, NULL, NULL );

// Make sure to pass dataArrayDevice as kernel parameter
// Run kernel
...

您需要考虑的是,您需要在执行之前了解 OpenCL 内核的内存要求。因此,如果在内核执行之前(即在主机中)执行内存分配可以是动态的。没有什么能阻止您多次调用内核,并且每次都调整(分配)内核内存需求。

考虑到这一点,我建议您重新考虑处理问题的方式。首先,使用结构数组比使用数组结构更简单(但不一定更有效)(在这种情况下,数组无论如何都必须具有固定大小)。

这只是为了让您了解 OpenCL 的工作原理。看看Khronos OpenCL resource page ,它有大量的 OpenCL 教程和示例,以及 Khronos OpenCL page ,其中包含官方 OpenCL 引用、手册页和快速引用卡。

关于opencl - 在 Opencl 中为结构中的动态数组分配内存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14259228/

相关文章:

clSetKernelArg 将 arg_value 从 16 更改为 140733193388048?

c++ - clEnqueueNDRangeKernel 填满整个内存

random - 在GPU上高效获取范围内的随机数

javascript - 检测浏览器是否使用 GPU 加速图形进行渲染

共享 GPU 上的 Tensorflow : how to automatically select the one that is unused

c++ - 如何正确调用命令缓冲区的 vulkan.hpp 构造函数?

signal-processing - 符合 OpenCL 的 DSP

c++ - opencl 硬件上的本地内存

c - 简单的 OpenCL 程序编译并运行但输出不正确

cuda - GPU 上的分支预测