详细程序注解学OpenCL一 环境配置和入门程序

来源:互联网 发布:教课的软件 编辑:程序博客网 时间:2024/06/03 05:06

本专栏是通过注解程序的方法学习OpenCL,我觉得一个一个地去抠原理也不是办法,干脆直接学习程序,然后把相关原理都直接注解到程序语句当中。

原创地址:http://blog.csdn.net/kenden23/article/details/14101657

一开始要配置好环境,我的是nvidia,所以就按照我的电脑举例,AMD应该也差不多。

1. 首先要到nvidia网站下载适合你显卡的最新驱动,安装好

2. 还是在nvidia网站下载好CUDA开发包,安装好

3. 如果默认安装路径的话,路径应该是在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0

4. 打开这个目录会发现里面有include和lib文件夹,这就是我们需要配置在visual studio中的文件

5. 打开visual studio(版本基本都无关系,我用的是vs2012),新建一个win32空项目。按下alt+F7打开项目属性,也可以点击项目文件右键,选择属性。

6. 在属性页里面找到“C/C++”的“常规”项,点击,右边有“附加包含目录”,然后编辑,添加目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\include

7.在属性页里面找到“连接器”,点击其“常规”项,右边有“附加库目录”,然后也是编辑,添加目录:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\Win32,如果是64位系统可以是:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v5.0\lib\x64。

8. 在属性页里找到“常规”项, 右边“附加依赖项”,编辑,添加lib文件:OpenCL.lib

9. 然后就可以新建源文件,在源文件里面添加相关的OpenCl程序,就可以调试OpenCL程序了。

下面就可以开始学习程序了。

下面是个入门程序,已经注释好了,注释包括了基本原理的解析,可以通过直接阅读和调试程序学习OpenCL了。

本程序是读取电脑中的支持OpenCL的硬件nvidia和intel和AMD等信息,然后显示在屏幕上。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#ifdef MAC#include <OpenCL/cl.h>#else#include <CL/cl.h>#endifint main() {/* Host data structures */cl_platform_id *platforms;//每一个cl_platform_id 结构表示一个在主机上的OpenCL执行平台,就是指电脑中支持OpenCL的硬件,如nvidia显卡,intel CPU和显卡,AMD显卡和CPU等cl_uint num_platforms;cl_int i, err, platform_index = -1;/* Extension data */char* ext_data;size_t ext_size;   const char icd_ext[] = "cl_khr_icd";//要使platform工作,需要两个步骤。1 需要为cl_platform_id结构分配内存空间。2 需要调用clGetPlatformIDs初始化这些数据结构。一般还需要步骤0:询问主机上有多少platforms/* Find number of platforms *///返回值如果为-1就说明调用函数失败,如果为0标明成功//第二个参数为NULL代表要咨询主机上有多少个platform,并使用num_platforms取得实际flatform数量。//第一个参数为1,代表我们需要取最多1个platform。可以改为任意大如:INT_MAX整数最大值。但是据说0,否则会报错,实际测试好像不会报错。下面是步骤0:询问主机有多少platformserr = clGetPlatformIDs(5, NULL, &num_platforms);if(err < 0) {perror("Couldn't find any platforms.");exit(1);}printf("I have platforms: %d\n", num_platforms); //本人计算机上显示为2,有intel和nvidia两个平台/* Access all installed platforms *///步骤1 创建cl_platform_id,并分配空间platforms = (cl_platform_id*) malloc(sizeof(cl_platform_id) * num_platforms);//步骤2 第二个参数用指针platforms存储platformclGetPlatformIDs(num_platforms, platforms, NULL);/* Find extensions of all platforms *///获取额外的平台信息。上面已经取得了平台id了,那么就可以进一步获取更加详细的信息了。//一个for循环获取所有的主机上的platforms信息for(i=0; i<num_platforms; i++) {/* Find size of extension data *///也是和前面一样,先设置第三和第四个参数为0和NULL,然后就可以用第五个参数ext_size获取额外信息的长度了。err = clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS, 0, NULL, &ext_size);if(err < 0) {perror("Couldn't read extension data.");exit(1);}printf("The size of extension data is: %d\n", ext_size);//我的计算机显示224./* Access extension data */  //这里的ext_data相当于一个缓存,存储相关信息。ext_data = (char*)malloc(ext_size);//这个函数就是获取相关信息的函数,第二个参数指明了需要什么样的信息,如这里的CL_PLATFORM_EXTENSIONS表示是opencl支持的扩展功能信息。我计算机输出一大串,机器比较新(专门为了学图形学而购置的电脑),支持的东西比较多。clGetPlatformInfo(platforms[i], CL_PLATFORM_EXTENSIONS, ext_size, ext_data, NULL);printf("Platform %d supports extensions: %s\n", i, ext_data);//这里是输出生产商的名字,比如我显卡信息是:NVIDIA CUDAchar *name = (char*)malloc(ext_size);clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, ext_size, name, NULL);printf("Platform %d name: %s\n", i, name);//这里是供应商信息,我显卡信息:NVIDIA Corporationchar *vendor = (char*)malloc(ext_size);clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR, ext_size, vendor, NULL);printf("Platform %d vendor: %s\n", i, vendor);//最高支持的OpenCL版本,本机显示:OpenCL1.1 CUDA 4.2.1char *version = (char*)malloc(ext_size);clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, ext_size, version, NULL);printf("Platform %d version: %s\n", i, version);//这个只有两个值:full profile 和 embeded profilechar *profile = (char*)malloc(ext_size);clGetPlatformInfo(platforms[i], CL_PLATFORM_PROFILE, ext_size, profile, NULL);printf("Platform %d full profile or embeded profile?: %s\n", i, profile);/* Look for ICD extension */   //如果支持ICD这一扩展功能的platform,输出显示,本机的Intel和Nvidia都支持这一扩展功能if(strstr(ext_data, icd_ext) != NULL) platform_index = i;std::cout<<"Platform_index = "<<platform_index<<std::endl;/* Display whether ICD extension is supported */if(platform_index > -1)printf("Platform %d supports the %s extension.\n", platform_index, icd_ext);std::cout<<std::endl;//释放空间free(ext_data);free(name);free(vendor);free(version);free(profile);}if(platform_index <= -1)printf("No platforms support the %s extension.\n", icd_ext);/* Deallocate resources */free(platforms);return 0;} 


每个电脑的输出结果不一样的,我电脑的输出结果是:

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 咳嗽停不下来怎么办 电动机停不下来怎么办 电脑所有程序都打不开怎么办 机顶盒画面卡顿怎么办 电脑画面卡顿怎么办 鞋舌头跑偏怎么办 球球大作战老卡怎么办 孩子被打却不敢还手怎么办? 自卫砍伤了人怎么办 系统还原节点黑屏了怎么办 我惹事了要被打怎么办 诛仙宠物太多怎么办 笔记本玩lolfps低怎么办 lol延迟有42怎么办 软件安装后黑屏怎么办 汽车脚垫翘边怎么办 晴季寿司会员怎么办 理财产品跑路了怎么办 宝宝足跟血异常怎么办 孩子足跟血异常怎么办 打印机显示用户干预怎么办 打印机脱机状态怎么办win10 电脑打印机显示脱机怎么办 佳能打印机显示脱机怎么办 汽车说明书丢了怎么办 oppo手机刷机后内存不足怎么办 电脑运行太慢怎么办 台式电脑卡慢怎么办 touch炫舞不记得区怎么办 产能过剩是带怎么办 裸辞找不到工作怎么办 30岁找不到工作怎么办 20岁找不到工作怎么办 年轻人一直找不到工作怎么办 经济不好的时候怎么办 dnf86没任务了怎么办 dnf打团队友开挂怎么办 幽灵行动4黑屏怎么办 禁用了显卡黑屏怎么办 w10系统卡死怎么办 玩cf跳fps怎么办