OpenCL中主机与设备之间的交一互

来源:互联网 发布:易企秀官网mac版 编辑:程序博客网 时间:2024/05/22 18:35

引言

opencl应用的第一步是查询平台集合,选择其中一个或多个平台应用中使用。

查询平台信息

平台集可以用以下命令查询:

cl_int clGetPlatformIDs( cl_uint num_entries,                          cl_platform_id *platforms,                         cl_uint *num_platforms                        )
其中各项参数的含义:
  • num_entries是可以加入平台的ID数量。如果平台数不是NULL,那么这一项必需是大于零。
  • platforms 会返回所找到的 OpenCL 平台的列表。platforms 中 cl_platform_id的值可以用来标识一个特定的 OpenCL 平台。
  • num_platforms 返回实际可用的 OpenCL 平台的数目。

这个命令会得到可用opencl平台列表。如果参数platforms是为NULL,clGetPlatformIDs会返回可用平台数。返回的平台数可以用num_entries来限制,这个要大于0并小于或等于可用平台数。可以举一个简单的例子说明如何查询和选择平台。下面使用clGetPlatformIDs得到一个平台IDs例表:

cl_int errNum;cl_uint numPlatforms;cl_platform_id *platformid;cl_context context =Null;errNum =clGetPlatformIDS(0,NULL,&numPlatforms);if( errNum !=CL_SUCCESS){  cout <<"something wrong getplatformIDs"<<endl;  return -1;}
这里面cnt = clGetPlatformIDs(1, &platform, NULL);就是指定了1平台,实际上有几个平台可用已经没有关系了,所以直接写成了NULL。。直接给的也是平台的地址&platform。

查询设备

cl_int clGetDeviceIDs(cl_platform_id platform,                      cl_device_type  device_type,                        cl_uint  num_entries,                        cl_device_id *devices,                        cl_uint  *num_devices)
其中各个参数的含义:
  • platform 是 clGetPlatformIDs 所返回的平台 ID 或者是 NULL。
  • device_type 是位域,用来标识 OpenCL 设备的类型
  • num_entries 是 cl_device 表项的数目,此表项可以添进 devices
  • devices 返回一个列表,其中存放所找到的 OpenCL 设备
  • num_devices 返回与 device_type 相匹配的可用 OpenCL 设备的数目

  cnt = clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device_id, NULL);    if (cnt != CL_SUCCESS)    {        cout <<"something wrong getdeviceIDs" << endl;        return -1;   }
CL_DEVICE_TYPE_CPU=====宿主机处理器。在其上运行 OpenCL 实现,是单核或多核 CPU。
CL_DEVICE_TYPE_GPU=====GPU。这意味着此设备也可以用来加速一个 3DAPI(如 OpenGL 或 DirectX)。
CL_DEVICE_TYPE_ACCELERATOR=====OpenGL 专用加速器(如 IBM 的 CELL Blade)。这些设备通过外围内联(如 PCIe)与宿主机处理器通信。
CL_DEVICE_TYPE_DEFAULT ===== 系统中默认的 OpenCL 设备。
CL_DEVICE_TYPE_ALL ===== 系统中所有可用的 OpenCL 设备。


敬请关注本博客和新浪微博songzi_tea.

原创粉丝点击