Data structures 在opencl中使用自定义结构

Data structures 在opencl中使用自定义结构,data-structures,opencl,Data Structures,Opencl,我正在尝试使用OpenCL内核的自定义数据结构。我在宿主程序中定义了一个简单的结构,如: struct myStruct{ cl_ulong n_occ; cl_ulong start_time; cl_ulong end_time; cl_ulong exec_time; cl_ulong total_time; cl_float avg_time; } myStruct_t; 等效的自定义数据结构定义也在我的OpenCL内核中完成 struct mySt

我正在尝试使用OpenCL内核的自定义数据结构。我在宿主程序中定义了一个简单的结构,如:

struct myStruct{
   cl_ulong n_occ;
   cl_ulong start_time;
   cl_ulong end_time;
   cl_ulong exec_time;
   cl_ulong total_time;
   cl_float avg_time;
} myStruct_t;
等效的自定义数据结构定义也在我的OpenCL内核中完成

struct myStruct{
   unsigned long n_occ;
   unsigned long start_time;
   unsigned long end_time;
   unsigned long exec_time;
   unsigned long total_time;
   float avg_time;
} myStruct_t;
内核函数如下所示:

__kernel void process_data( __global myStruct_t* input, __global myStruct_t* output){
    output->start_time = input->start_time;
    output->end_time = input->end_time;
    output->exec_time = input->end_time - input->start_time;
    output->total_time = input->total_time + output->exec_time;
    output->n_occ = input->n_occ + 1;
    output->avg_time = output->total_time / output->n_occ;
}
我使用Nvidia卡作为GPU设备。在执行内核代码之后,我得到了不正确的结果。我不明白原因。有什么东西不见了吗


提前感谢您的帮助。

您是否检查了主机结构(C)是否正确(还要确保OpenCL端正确,并且两者报告的大小相同)?在两个结构中使用相同的cl_*类型也可能是一个好主意。

如何知道主机结构和OpenCL端结构是否正确打包并报告它们的大小相同?你认为我在两个结构中没有使用相同的cl_*类型吗?我想我使用相同的类型。我的意思是-使用实际的类型,因为这是一个更好的实践。然而,这似乎不是你的问题-你肯定是一些填充/打包工件的受害者。首先尝试使用#pragma和OpenCL“attribute((packed))。确保大小正确的一个简单方法是将名为size的字段声明为第一个字段,并在CL设备上填充值。然后将缓冲区结构中的返回值与主机上“sizeof”返回的值进行检查。您所说的“不正确的结果”是什么意思?输入是什么,输出是什么?您是否只处理一个输入和一个输出?如果是这样的话,在内核上运行它的原因是什么?如果您对多个输入/输出执行此操作,您的代码不应该像
output[id].start\u time=input[id].start\u time在内核中?这只是在OpenCL中使用自定义结构的一个简单入门。下一步将包括为OpenCL内核提供一个自定义结构的大向量。