GPU 上的指针大小与 CPU 上的指针大小

Size of pointer on GPU vs. size of pointer on CPU

我正在设备端定义一个结构。它在 GPU 和 CPU 上的大小是否相同?

主机端:

typedef struct {
    cl_float4* ptr;
} my_struct_cpu;

设备端:

typedef struct {
    float4* ptr;
} my_struct_gpu;

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

这样的结构对于两边的使用来说基本上是无稽之谈,因为你不能在另一个cl_mem.

中传递指向一个cl_mem的指针

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

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

The default compute device address space size specified as an unsigned integer value in bits. Currently supported values are 32 or 64 bits.

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

主办方:

  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){...}

简短回答:不,并非总是如此。但是如果你把更大的元素放在结构的上端并且字节顺序相同,那么对于某些 gpu 来说应该没有问题。如果有float3类型那么你不应该直接发送它们。

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 位是很常见的 pointers.h 对于 OpenCL 2.x,情况可能并非如此。特别是 OpenCL 2.0 在 CPU 和 GPU 之间引入了共享虚拟内存作为扩展,如果给定的 OpenCL 平台支持这一点,那么主机和设备指针的大小确实相同。此外,如果支持全细粒度 SVM,这是一个额外的扩展,那么可以将主机指针直接传递给设备,例如在其他数据结构中。