Opencl中结构中动态数组的内存对象分配

Opencl中结构中动态数组的内存对象分配,opencl,gpgpu,gpu,Opencl,Gpgpu,Gpu,我在C中创建了以下结构“data” typedef struct data { double *dattr; int d_id; int bestCent; }Data; “dattr”是上述结构中保持动态的数组。 假设我必须创建10个以上结构的对象。i、 e dataNode = (Data *)malloc

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

typedef struct data
{
  double *dattr;                           
  int d_id;                                
  int bestCent;                            
}Data;
“dattr”是上述结构中保持动态的数组。 假设我必须创建10个以上结构的对象。i、 e

dataNode = (Data *)malloc (sizeof(Data) * 10);
对于此结构的每个对象,我必须使用以下命令在C中重新分配数组“dattr”的内存:

for(i=0; i<10; i++)
   dataNode[i].dattr = (double *)malloc(sizeof(double) * 3);

for(i=0;iOpenCL设备(例如GPU)中的内存分配必须在主机线程中使用(或/如果您希望使用纹理内存)。这些函数允许您自动将主机数据(例如使用malloc创建)复制到设备,但我通常更喜欢显式使用/(或/如果使用纹理内存),以便我可以分析数据传输。以下是一个示例:

#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的工作原理。看看,它有大量的OpenCL教程和示例,还有官方的OpenCL参考资料、手册页和快速参考卡。

正如Faken所建议的那样,如果你关心动态内存分配,并且渴望稍微改变一下算法,这里我有一些提示:

以下代码动态分配本地内存空间,并将其作为第8个参数传递给OpenCL内核:

  int N; //Number_of_data_points, which will keep on changing as per your requirement  
   size_t localMemSize = ( N* sizeof(int));      
 ...   
 // Dynamically allocate local memory (allocated per workgroup)
 clSetKernelArg(kernel, 8, localMemSize, NULL);

我要补充的是,OpenCL不仅仅是一个框架,你可以在一个成品上使用它来加快它的运行速度。你必须在OpenCL范式上设计你的程序的工作流,而不是相反。faken>>非常感谢你的关注和回答我的问题。但是根据我正在设计的应用程序的要求,我必须保留它动态。所以我不能有一个固定大小的数组。只想检查OpenCL中是否有任何上述内存分配的规定。否则,我必须重新考虑我的方法,因为你有足够的内存。你需要考虑的是,你需要知道OpenCL内核在执行之前的内存需求。如果在内核执行之前(即在主机中)执行,则必须是动态的。没有任何东西可以阻止您多次调用内核,并在每次调用中调整(分配)内核内存需求。