`
bcyy
  • 浏览: 1809306 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

本专栏是通过注解程序的方法学习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>
#endif

int 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:询问主机有多少platforms
	err = 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存储platform
	clGetPlatformIDs(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 CUDA
		char *name = (char*)malloc(ext_size);
		clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, 	
			ext_size, name, NULL);				
		printf("Platform %d name: %s\n", i, name);

		//这里是供应商信息,我显卡信息:NVIDIA Corporation
		char *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.1
		char *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 profile
		char *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;
} 


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

分享到:
评论

相关推荐

    VS2010+AMD+OPENCL开发环境配置详细教程

    VS2010+AMD+OPENCL开发环境配置详细教程

    VS2010 AMD OpenCL 开发环境配置, 32位+64位

    VS2010 AMD OpenCL 开发环境配置, 32位+64位

    OpenCL中文入门完整教程

    这个教程是引导我opencl入门的教程,挺有帮助的。介绍了opencl内存对象,kernel编写,GPU架构,线程调度,性能优化,都有具体例子。

    opencl环境配置

    opencl环境配置、配置OpenCL工程、64位配置、32位配置等

    opencl 小程序

    opencl 小程序 适合初学着 计算两个数组相加的和,放到另一个数组中去。程序用cpu和gpu分别计算,最后验证它们是否相等。

    Opencl入门学习例子

    一个完整的OpenCL加速技术过程涉及到平台(Platform)、设备(Device)、上下文(Context)、OpenCL程序(Program)、指令队列(Command)、核函数(Kernel)、内存对象(Memory Object)、调用设备接口(NDRange),...

    OpenCL编程入门

    OpenCL编程入门 OpenCL编程指南 OpenCL编程示例 OpenCL编程学习笔记

    OpenCL学习资料合集

    OpenCL学习资料合集 编程指南 入门教程 1Khronos 官方资料 2入门学习教程(OpenCLTutorial-Chinese中文教程) 3OpenCL优化和加速 4基于Cuda架构 5AMD OpenCL C++kernel

    OpenCL学习资料合辑(OpenCL编程指南,OpenCL中文教程(AMD),OpenCL编程入门)

    OpenCL学习资料合辑包括OpenCL编程指南,OpenCL中文教程(AMD),OpenCL编程入门

    OpenCL编写的Hello程序,是个最小系统,可以入门

    OpenCL编写的Hello程序,是个最小系统,可以入门,基本的程序框架都有。很简单的。在很多地方都可以找到。

    opencl入门例子

    适合opencl初学者,通过本例子,可以了解opencl运行的流程,知道如何并行执行程序。

    Altera OpenCL入门》

    Altera OpenCL入门 有基本使用流程 短时间学会在fpga上进行opencl开发

    opencl从环境变量设置和编译.docx

    opencl从环境变量设置和编译

    OpenCL学习资料大全

    OpenCL学习资料大全,适合初学者,里面有很多个pdf

    OpenCL编程指南(带详细目录)

    OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了 基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实 践,...

    opencl编程指南(中文版SDK)

    OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了 基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实 践,...

    opencl示例程序

    一个opencl入门的示例程序,亲自跑通。vs2013,n卡。 程序来源为http://www.cnblogs.com/zenny-chen/archive/2013/06/14/3136158.html,,经过自己的少量修改

    AMD OpenCL 中文版教程

    OpenCL由两部分组成,一是用于编写内核程序(在OpenCL设备上运行的代码) 的语 言,二是定义并控制平台的API。OpenCL提供了基于任务和基于数据两种并行计算机制,它极大地扩 展了GPU 的应用范围,使之不再局限于图形...

    OpenCL编程指南

    OpenCL领域公认的权威著作,由OpenCL核心设计人员亲自执笔,不仅全面而深刻地解读了OpenCL规范和编程模型,而且通过大量案例和代码演示了基于OpenCL编写并行程序和实现各种并行算法的原理、方法、流程和最佳实践,...

Global site tag (gtag.js) - Google Analytics