#第二章 平台模型
开发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, ¶m_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, ¶m_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