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

时间:2015-03-27 14:16:59

标签: opencl

我在设备端定义了一个结构。它会在gpu和cpu上具有相同的大小吗?

HOST SIDE:

typedef struct {
    cl_float4* ptr;
} my_struct_cpu;

设备方:

typedef struct {
    float4* ptr;
} my_struct_gpu;

4 个答案:

答案 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)

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

可以使用clGetDeviceInfoCL_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,那么你不应该直接发送它们。