我在设备端定义了一个结构。它会在gpu和cpu上具有相同的大小吗?
HOST SIDE:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
设备方:
typedef struct {
float4* ptr;
} my_struct_gpu;
答案 0 :(得分:1)
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
在这种情况下,主机指针将是sizeof(int *)== sizeof(cl_float4 *),它将映射到4或8个字节,具体取决于您的应用程序是以32位还是64位编译。如果您使用的是非移动设备,并且智能手机上可能是32位或64位,则最有可能是64位,尽管这种情况正在发生变化。
typedef struct {
float4* ptr;
} my_struct_gpu;
设备上的sizeof(int *)== sizeof(float4 *),也可以是32位或64位,但是,对于OpenCL 1.x,不要求主机指针和设备指针需要相同的大小事实上,GPU通常是32位指针 对于OpenCL 2.x,情况可能并非如此。特别是OpenCL 2.0在CPU和GPU之间引入了共享虚拟内存,作为扩展,如果给定的OpenCL平台支持,那么主机和设备指针的大小确实相同。此外,如果支持完整的细粒度SVM,这是一个额外的扩展,那么可以传递将主机指针直接传递给设备,例如,在其他数据结构中。
答案 1 :(得分:0)
你能举例说明你将如何使用它?
这样的结构基本上是无意义的,因为你无法将指针传递给另一个cl_mem中的一个cl_mem。
答案 2 :(得分:0)
无法保证设备上指针的大小与主机上的大小相同。因此,也无法保证结构具有相同的大小。
可以使用clGetDeviceInfo
和CL_DEVICE_ADDRESS_BITS
作为 param_name ,在运行时期间为特定设备的指针请求使用的大小。 OpenCL规范说明了返回值的以下内容。
默认计算设备地址空间大小,指定为无符号整数值(以位为单位)。目前支持的值为32或64位。
我测试过的机器使用的是64位大小的指针,而GPU则返回了32位。因此,在这种情况下,结构将具有不同的大小。
答案 3 :(得分:0)
主持人:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
float * SerializeForPcieSend(my_struct_cpu [] p){...}
发送到gpu:
array_of_floats_widthx4 -----> enqueuewritebuffer
gpu side:接收并构建cl-side结构:
__kernel void BuildStructs(__global float * structArr, __global my_struct_gpu * structs_in_gpu)
{
.... copies, computes, builds
}
然后gpu计算这个新数据
__kernel void BuildStructs(__global my_struct_gpu * structs_in_gpu, __global float * responseArray)
{
.... computes, extracts elements and puts in response array
}
主机方:然后cpu取结果
clenqueuereadbuffer
array_of_floats_widthx4 <------------- response array
别忘了用sizeof(cl_float)* num_elements仔细检查缓冲区读写的大小。
然后重新构建主机端对象
my_struct_cpu * DeserializeAfterPcieDownload(float * p){...}
简短回答:不,不总是。但是如果你把更大的元素放在struct的上层并且endianness是相同的,那么对于某些gpus来说应该没有问题。如果有float3 tyeps,那么你不应该直接发送它们。