- OpenCL平台API : 平台API定义了宿主机程序发现OpenCL设备所用的函数以及这些函数的功能,另外还定义了为OpenCL应用创建上下文的函数.
- 这里推荐一下我的参考书籍:《OpenCL编程指南》和《OpenCL异构计算》,前者风格像一个说明文档,后者带你实践;推荐后者因为代码更简洁一些,本来OpenCL初始化都有点复杂了,而前者还能搞的更复杂,苦笑……,不过《指南》的优点是对API解释的比较详细。
- 再送一个在线的OpenCL API查询库,建议收藏:OpenCL 2.1 Reference Pages
- 让了让萌新们更快上手,我直接以实例开始,争取读完就能写下自己第一个OpenCL程序,至于API的学习参考书籍或者上一条
- 为方便查阅,本系列用到的几个API将在篇二给出说明,我先写好的篇三ヾ(o◕∀◕)ノヾ。
一、初始化的平台相关变量
这里主要有平台、上下文、设备、命令队列、程序、内核等,这几项是通用的;其他如缓冲区等看需创建哈。文件开始先声明几个需要主要的变量:
cl_int errNum;
cl_platform_id platform; // 0. 使用简明:
cl_device_id device; // 1. 在平台选定设备
cl_context context; // 2.1 在指定设备创建上下文
cl_command_queue cmdqueue; // 创建一个命令队列关联上下文中指定设备
cl_program program; // 2.2 关联上下文创建程序对象,并对列表设备构建
cl_kernel kernel; // 3. 由程序对象创建内核
printf("\n\n OpenCL_Initing .....");
1.1、查询平台 clGetPlatformIDs( )
首先呢,我们申请一个平台变量的指针类型,在获取平台个数以后,再为其指定空间。对clGetPlatformIDs调用两次,第一次获取获取平台数量,第二次获取平台列表。有些老式设备在第一次调用clGetPlatformIDs可能花费时间较久,比如我的,建议选择以高性能显卡启动VS,情况会稍微缓解一些。
cl_uint numPlatforms =1;
cl_platform_id *platformIds;
errNum = clGetPlatformIDs( 1, NULL, &numPlatforms);
platformIds =(cl_platform_id*)malloc(sizeof(cl_platform_id)*numPlatforms);
errNum = clGetPlatformIDs( numPlatforms, platformIds, NULL);
assert(errNum==CL_SUCCESS);
1.2、 从平台查询设备 clGetDeviceIDs( )
一般情况我们直接选定第一个平台,查询设备即可,入门可以选这样干着,日后熟悉OpenCL了可以实验深入一点的东西。这个方式和查询平台相同,第一次调用查询设备数,创建存储空间后第二次获取设备列表。这里需要指定设备类型。