我在设备端定义了一个结构。它在GPU和CPU上会有相同的大小吗?
东道方:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;设备侧:
typedef struct {
float4* ptr;
} my_struct_gpu;发布于 2015-03-27 21:31:10
typedef struct {
cl_float4* ptr;
} my_struct_cpu;在这种情况下,主机指针的大小为(int*) == sizeof(cl_float4*),它将映射到4字节或8字节,这取决于应用程序是用32位还是64位编译的。最有可能是64位,如果你是在一个非移动设备,也许32位或64位在智能手机,尽管这是正在改变。
typedef struct {
float4* ptr;
} my_struct_gpu;==的大小(int*)在设备上也可以是32位或64位,但是,对于OpenCL 1.x,不需要主机指针和设备指针的大小相同,实际上,OpenCL 2.x的GPU将是32位pointers.h,这是非常常见的情况。尤其是,OpenCL 2.0在CPU和GPU之间引入了共享虚拟内存,作为扩展,如果给定的OpenCL平台支持这一点,那么主机和设备指针的大小实际上是相同的。此外,如果支持全细粒度支持向量机,这是一个额外的扩展,那么就可以将主机指针直接传递给设备,例如在其他数据结构中。
发布于 2015-03-27 14:58:12
你能举个例子说明你将如何使用它吗?
这种结构在两边使用基本上都是胡说八道,因为您不能在另一个cl_mem中传递指向一个cl_mem的指针。
发布于 2015-03-27 15:24:14
不能保证设备上指针的大小与主机上的大小相同。因此,也不能保证结构将具有相同的大小。
通过使用clGetDeviceInfo和CL_DEVICE_ADDRESS_BITS作为param_name,可以在运行时为特定设备的指针请求使用的大小。OpenCL规范说明了返回值的如下内容。
指定为无符号整数值的默认计算设备地址空间大小(以位为单位)。当前支持的值为32位或64位。
我在上面测试的机器使用64位大小的指针,而GPU则返回32位。因此,在这种情况下,结构将是不同的大小。
https://stackoverflow.com/questions/29302831
复制相似问题