2012-08-13 61 views
3

我试图在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 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为设备。在执行内核代码之后,我得到了不正确的结果。我不明白原因。有什么缺失?

非常感谢您的帮助。

+0

“结果不正确”是什么意思?什么是输入,输出是什么? – 2012-08-13 16:43:57

+0

你只在一个输入和一个输出上工作吗?如果是这样,在内核上运行它的原因是什么?如果你在多个输入/输出上执行它,你的代码不应该像'output [id] .start_time = input [id] .start_time;'在你的内核中吗? – dkg 2012-08-16 08:16:50

+0

这只是在OpenCL中使用自定义结构的简单启动。下一步将向OpenCL内核提供一个大型的自定义结构向量。 – semteu 2012-08-23 01:51:50

回答

5

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

+0

如何知道主机结构和OpenCL端结构是否正确打包并报告它们的大小相同?你认为我在两个结构中都没有使用相同的cl_ *类型吗?我想我使用相同的类型。 – semteu 2012-08-13 16:13:58

+0

我的意思是 - 使用实际的类型,因为它更好的做法。但是,这似乎不是你的问题 - 你肯定是一些填充/打包工件的受害者。首先尝试#pragma和OpenCL“__attribute__((packed))”。 – Ani 2012-08-13 18:55:10

+4

确保尺寸正确的一种简单方法是声明一个名为size的字段作为第一个字段并填充CL设备上的值。然后检查缓冲区结构中返回的值,并在主机上返回一个由“sizeof”返回的值。 – Ani 2012-08-13 19:02:24