Struct OpenCL floatn与自定义结构有何不同

Struct OpenCL floatn与自定义结构有何不同,struct,opencl,Struct,Opencl,我在向OpenCL内核传递向量结构时遇到问题 长话短说,我发现我可以通过C结构: typedef struct { cl_float4 vec; } my_type; 。对于内核,如果我这样声明: typedef struct { float s[4]; } my_float4; typedef struct { my_float4 vec; } my_type; //use custom float4 __kernel void function(const my_type test

我在向OpenCL内核传递向量结构时遇到问题

长话短说,我发现我可以通过C结构:

typedef struct {
    cl_float4 vec;
} my_type;
。对于内核,如果我这样声明:

typedef struct { float s[4]; } my_float4;
typedef struct { my_float4 vec; } my_type; //use custom float4
__kernel void function(const my_type test) {}
typedef struct { float4 vec; } my_type; //use built-in float4
__kernel void function(const my_type test) {}
。但不是,如果我这样声明:

typedef struct { float s[4]; } my_float4;
typedef struct { my_float4 vec; } my_type; //use custom float4
__kernel void function(const my_type test) {}
typedef struct { float4 vec; } my_type; //use built-in float4
__kernel void function(const my_type test) {}
所以我的问题是,是什么让浮动4与众不同?在第二个示例中,我在clSetKernelArg上获得了CL_INVALID_ARG_SIZE。在主机代码中,我使用的是cl_float4——它不应该与内核中的float4配对吗?



编辑:根据请求,clSetKernelArg代码(错误处理裁剪):


这听起来像是您的实现中的一个bug——您应该能够将用户定义的类型毫无问题地传递给内核。您使用的是什么平台/SDK?我能够在主机代码中成功声明此类型:

typedef struct _mytype {
    cl_float4 val;
} mytype;
。。。然后再使用它:

mytype t;
status = clSetKernelArg(kernel, argc++, sizeof(mytype), &t);
check_status("clSetKernelArg:mytype t", status);
其中check_status执行您期望的操作:检查非
CL_SUCCESS
返回值

内核如下所示:

typedef struct _mytype {
  float4 value;
} mytype;

kernel void do_it(/* ... */, const mytype test) { /* ... */ }

这将编译并执行,在CPU设备上给出正确的结果。

您能显示准确的CLSETKENELARG调用和相关代码吗?这可能是一个结构对齐问题,但如果没有看到代码,很难说。添加了函数。结构已经是精确的代码。仍然缺少模板实例化…没有显式的模板实例化。它在头文件中以这种方式声明。从调用的代码中,您可以推断编译器将实例化.set_argumenthmm,我尝试了这个确切的示例,它成功了。然后,我无法用以前使用的代码重现我的问题。然而,我确实遇到了另一个障碍——你不能混合cl_浮动3和cl_浮动。我发现你需要四个浮动(对齐),这就解决了它。所以不确定最初的问题是什么:不过,谢谢你的帮助!