OpenCL教程 第二章 平台模型

#第二章 平台模型
开发OpenCL的第一步是获取OpenCL平台,OpneCL平台就是电脑上OpenCL加速设备的厂商发布的加速平台,比如显卡平台有CUDA,AMD加速器等,CPU平台有Intel CPU加速器,FPGA平台有Xilinx和Altera等,不同的平台支持的OpenCL的版本不同,支持的功能扩展不同。
####以下两个接口是关于平台的:

cl_int clGetPlatformIDs (cl_uint num_entries,            //想要查询的平台上限个数
                         cl_platform_id *platforms,      //查询后获得的平台列表,存放所有平台的ID
                         cl_uint *num_platforms)         //当前可查询的平台的数量
                                                         //返回值是cl_int类型的错误代码
cl_int clGetPlatformInfo (cl_platform_id platform,        //平台ID
                          cl_platform_info param_name,    //想要查询的信息名称
                          size_t param_value_size,        //传入用于存放信息的参数的大小
                          void *param_value,              //传入用于存放信息的参数
                          size_t *param_value_size_ret)   //返回用于存放信息的参数的大小

####查询平台的方法:

cl_uint num_platforms;
clGetPlatformIDs(0, NULL, &num_platforms);
//当第二个参数为NULL的时候,函数将会查询当前可用平台的数量,并保存在第三个参数
cl_platform_id *platforms = new cl_platform_id[num_platforms];
clGetPlatformIDs(num_platforms, platforms, NULL);
//获取平台数量后可以查询平台,将查询到的平台ID保存在第二个列表参数中

OpenCL中平台由cl_platform_id这样一个结构保存,就是平台的身份标识,不同的平台ID不同,访问平台就是访问这个结构,正确查询后会返回CL_SUCCESS,错误查询会返回相应的错误代码。

####查询平台信息的方法:

size_t param_value_size;
clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, NULL, &param_value_size);
//将第三个参数设置为0,第四个参数设置为NULL,查询信息的大小并保存在第四个参数
char *param_value = new char[param_value_size];
clGetPlatformInfo(platform, CL_PLATFORM_NAME, param_value_size, param_value, NULL);
//将获取的参数大小传入,查询的信息将保存在第四个参数

可查询的平台信息有:
这里写图片描述

实验代码:

#include "opencl.h"
int main(){
    cl_uint num_platforms;
    clGetPlatformIDs(0, NULL, &num_platforms);
    cl_platform_id *platforms = new cl_platform_id[num_platforms];
    clGetPlatformIDs(num_platforms, platforms, NULL);
    cl_platform_info platformInfo[5] = {
        CL_PLATFORM_NAME,
        CL_PLATFORM_VENDOR,
        CL_PLATFORM_VERSION,
        CL_PLATFORM_PROFILE,
        CL_PLATFORM_EXTENSIONS };
    string platformInfoString[5] = {
        "CL_PLATFORM_NAME",
        "CL_PLATFORM_VENDOR",
        "CL_PLATFORM_VERSION",
        "CL_PLATFORM_PROFILE",
        "CL_PLATFORM_EXTENSIONS" };
    for (cl_uint j = 0; j < num_platforms; j++){
        cout << "Platform " << j + 1 << ':' << endl;
        for (cl_uint i = 0; i < 5; i++){
            cl_int err;
            size_t param_value_size;
            err = clGetPlatformInfo(platforms[j], platformInfo[i], 0, NULL, &param_value_size);
            if (err != CL_SUCCESS){
                checkError(err, "Can not get platform info");
                continue;
            }
            else{
                char *param_value = new char[param_value_size];
                err = clGetPlatformInfo(platforms[j], platformInfo[i], param_value_size, param_value, NULL);
                if (err != CL_SUCCESS){
                    checkError(err, "Can not get platform info");
                    continue;
                }
                else{
                    string param_value_string = param_value;
                    if (i == 4){
                        cl_uint num = 0;
                        cl_uint pos[30];
                        for (cl_uint k = 0; k < param_value_size; k++){
                            if (param_value_string[k] == ' '){
                                pos[num] = k;
                                num++;
                            }
                        }
                        for (cl_uint k = 0; k < num; k++)param_value_string.replace(pos[k] + k * 5, 1, "\n\t\t\t\t\t");
                    }
                    printf("%-40s", platformInfoString[i].c_str());
                    cout << param_value_string << endl;
                }
            }
        }
        cout << endl;
    }
    return 0;
}

实验结果:
这里写图片描述

实验结果可以看出我的电脑一共有三个OpenCL平台,分别是
(1)Intel FPGA(原先的Altera)
(2)Nvidia GPU
(3)Intel CPU

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值