I am defining a struct on the device side. Will it have the same size on GPU and CPU?
HOST SIDE:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
DEVICE SIDE:
typedef struct {
float4* ptr;
} my_struct_gpu;
I am defining a struct on the device side. Will it have the same size on GPU and CPU?
HOST SIDE:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
DEVICE SIDE:
typedef struct {
float4* ptr;
} my_struct_gpu;
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
在这种情况下,主机指针将是 sizeof(int*) == sizeof(cl_float4*),它将映射到 4 或 8 个字节,具体取决于您的应用程序是用 32 位还是 64 位编译的。如果您在非移动设备上,最有可能是 64 位,在智能手机上可能是 32 位或 64 位,尽管这种情况正在发生变化。
typedef struct {
float4* ptr;
} my_struct_gpu;
sizeof(int*) == sizeof(float4*) 在设备上,同样可以是 32 位或 64 位,但是,对于 OpenCL 1.x,主机指针和设备指针不需要相同大小,事实上GPU 是 32 位指针是很常见的。h 对于 OpenCL 2.x,情况可能并非如此。特别是 OpenCL 2.0 引入了 CPU 和 GPU 之间的共享虚拟内存作为扩展,如果给定的 OpenCL 平台支持这一点,那么主机和设备指针的大小确实是相同的。此外,如果支持全细粒度 SVM,这是一个额外的扩展,则可以将主机指针直接传递给设备,例如在其他数据结构内。
主机端:
typedef struct {
cl_float4* ptr;
} my_struct_cpu;
float * SerializeForPcieSend(my_struct_cpu [] p){...}
发送到 GPU:
array_of_floats_widthx4 -----> enqueuewritebuffer
gpu 端:接收和构建 cl 端结构:
__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){...}
简短的回答:不,并非总是如此。但是如果你将更大的元素放在结构的上侧并且字节顺序相同,那么对于某些 gpus 应该没有问题。如果有 float3 类型,那么您不应该直接发送它们。
你能举例说明你将如何使用它吗?
这样的结构对于双方的使用基本上是无意义的,因为你不能将指针传递给另一个 cl_mem 中的一个 cl_mem。
无法保证设备上的指针大小与主机上的大小相同。因此,也不能保证结构将具有相同的大小。
可以通过使用clGetDeviceInfo
和CL_DEVICE_ADDRESS_BITS
作为param_name在运行时请求特定设备指针的使用大小。OpenCL 规范对返回值进行了如下说明。
默认计算设备地址空间大小指定为无符号整数值(以位为单位)。当前支持的值为 32 或 64 位。
我测试的机器使用的是 64 位大小的指针,而为 GPU 返回了 32 位。因此,在这种情况下,结构将具有不同的大小。