openCL-系统装置的信息获取

来源:互联网 发布:浙师大行知学院官网 编辑:程序博客网 时间:2024/05/18 00:37

   获取电脑装置信息的有两种方法,一是通过doc窗口获得,第二个是通过程序

  一.doc窗口获得

     输入clinfo,可以获得相应的信息

 

 二 程序

     这里是用的openCL的API获得

    

#include <iostream>#include <string> #include <vector>#include <CL/cl.h> int main(){cl_int err;cl_uint num;//取得 platform 的数目err = clGetPlatformIDs(0,0,&num);if(err !=CL_SUCCESS){std::cerr<<"Unable to get platforms\n";return 0;}//取得platform的IDstd::vector<cl_platform_id> platforms(num);    err = clGetPlatformIDs(num,&platforms[0],&num);std::cout<<"num="<<num<<std::endl;    if(err != CL_SUCCESS){std::cerr<<"Unable to get platform ID"<<std::endl;return 0;}    //获得OpenCL contextcl_context_properties prop[] = {CL_CONTEXT_PLATFORM,     reinterpret_cast<cl_context_properties>(platforms[0]),0};cl_context context = clCreateContextFromType(prop, CL_DEVICE_TYPE_DEFAULT, NULL,NULL,NULL);if(context == 0){std::cerr << "Can't create OpenCL context\n"; return 0;}/*clCreateContextFromType 是一个 OpenCL 的 API,它可以从指定的装置类別中,建立一个 OpenCL context。第一个参数是指定 context 的 property。在 OpenCL 中,是透过一个 property 的阵列,以「property 种类」及「property 內容」成对出现,并以 0 做为结束。例如,以上面的例子来说,要指定的 property 种类是 CL_CONTEXT_PLATFORM,即要使用的 platform ID,而 property 內容则是由之前取得的 platform ID 中的第一个(即 platforms[0])。由于 property 的內容可能是不同的资料型态,因此需要使用 reinterpret_cast 来进行强制转型。     第二个参数可以指定要使用的装置类別。目前可以使用的类別包括:CL_DEVICE_TYPE_CPU:使用 CPU 装置CL_DEVICE_TYPE_GPU:使用显示晶片装置CL_DEVICE_TYPE_ACCELERATOR:特定的 OpenCL 加速装置,例如 CELLCL_DEVICE_TYPE_DEFAULT:系统预设的 OpenCL 装置CL_DEVICE_TYPE_ALL:所有系统计中的 OpenCL 装置 这里使用的是 CL_DEVICE_TYPE_DEFAULT,也就是指定使用预设的装置。另外,在这里,直接使用了之前取得的 OpenCL platform ID 中的第一个 ID(实际的程式中,可能会需要让使用者可以指定要使用哪一个 platform)。 如果建立 OpenCL context 失败,会传回 0。因此,要进行检查,并显示错误讯息。如果建立成功的话,在使用完后,要记得将 context 释放。这可以透过呼叫 clReleaseContext 来达成。*/    //clReleaseContext(context);   //获得装置列表   size_t cb;   clGetContextInfo(context,CL_CONTEXT_DEVICES,0,NULL,&cb);   std::vector<cl_device_id> devices(cb / sizeof(cl_device_id));   clGetContextInfo(context,CL_CONTEXT_DEVICES,cb, &devices[0], 0);   clGetDeviceInfo(devices[0], CL_DEVICE_NAME, 0, NULL, &cb);  //获得装置名称   std::string devname;   devname.resize(cb);   clGetDeviceInfo(devices[0], CL_DEVICE_NAME, cb, &devname[0], 0);   std::cout << "Device: " << devname.c_str() << "\n";   //释放    clReleaseContext(context);return 0;}