1

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;
4

4 回答 4

1
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,这是一个额外的扩展,则可以将主机指针直接传递给设备,例如在其他数据结构内。

于 2015-03-27T21:31:10.853 回答
0

主机端:

  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 类型,那么您不应该直接发送它们。

于 2015-03-27T20:31:42.590 回答
0

你能举例说明你将如何使用它吗?

这样的结构对于双方的使用基本上是无意义的,因为你不能将指针传递给另一个 cl_mem 中的一个 cl_mem。

于 2015-03-27T14:58:12.560 回答
0

无法保证设备上的指针大小与主机上的大小相同。因此,也不能保证结构将具有相同的大小。

可以通过使用clGetDeviceInfoCL_DEVICE_ADDRESS_BITS作为param_name在运行时请求特定设备指针的使用大小。OpenCL 规范对返回值进行了如下说明。

默认计算设备地址空间大小指定为无符号整数值(以位为单位)。当前支持的值为 32 或 64 位。

我测试的机器使用的是 64 位大小的指针,而为 GPU 返回了 32 位。因此,在这种情况下,结构将具有不同的大小。

于 2015-03-27T15:24:14.467 回答