从零开始学习OpenCL开发(二)一个最简单的示例与简单性能分析

本文从零开始介绍OpenCL开发,通过一个简单的数组相加示例,展示了OpenCL的基本使用流程,包括获取平台、设备信息,创建上下文,执行kernel函数等步骤。此外,还进行了性能分析,探讨了OpenCL在不同平台和计算复杂度下的性能表现,揭示了OpenCL在异构计算中提高性能的潜力,但强调了内存拷贝时间和计算复杂度的影响。
摘要由CSDN通过智能技术生成

欢迎关注 转载请注明 http://blog.csdn.net/leonwei/article/details/8893796

 

1 Hello OpenCL 

    这里编写一个最简单的示例程序,演示OpenCl的基本使用方法:

    1.首先可以从Nvdia或者Amd或者Intel或者所有OpenCl成员的开发者网站上下载一份他们实现的OpenCL的SDK。虽然不同公司支持了不同版本的OpenCL和扩展ext,但是在相同版本上对于标准的OpenCL接口,每个SDK实现的结果都是一样的,如果你只是用标准的OpenCL规范,那么采用哪个SDK无所谓,当然有些公司把OpenCL SDK捆绑在更大的SDK里,如NVDIA放在他们的CUDA开发包里,这时我们要做的只是把其中cl文件夹下的h 以及 OpenCL.lib OpenCL.dll文件拿出来就行。

 

   下面进入代码的部分,本例中实现两个一维数组的相加(这是最容易理解的可并行计算问题),代码主要这几个部分:

 

   2.获取机器中所有已实现的OpenCL平台:

   //get platform numbers
   err = clGetPlatformIDs(0, 0, &num);
 

 //get all platforms
  vector<cl_platform_id> platforms(num);
  err = clGetPlatformIDs(num, &platforms[0], &num);

 

  首先要知道OpenCL平台platform是什么意思。我们知道不同OpenCL组织里不同厂商的不同硬件都纷纷支持OpenCL标准,而每个支持者都会独自去实现OpenCl的具体实现,这样如果你的机器中有很多个不同“OpenCl厂商”的硬件(通常实现在驱动中),那么你的机器中就会出现几套对OpenCL的不同实现,如你装了intel cpu,可能就一套intel的实现,装了NVDIA的显卡,可能还有一套Nvidia的实现,还有值得注意的是,就算你可能没有装AMD的显卡,但是你装了AMD的opencl开发包,你机器中也可能存在一套AMD的实现。这里的每套实现都是一个platform,可以说不同厂商拿到的SDK可能是一样的,但是查询到的机器里的platform则可能是不一样的,sdk是代码层,platform是在驱动里的实现层,opencl在不同厂商的代码层一样,但是在一个机器里会存在不同的实现层(原凉我这么啰嗦,但是这个问题我开始纠结了很久)。

 不同厂商给了相同的代码SDK,但是在驱动层,不同厂商的实现是完全不一样的,也就是paltform是不一样的,例如NVIDIA的的platform只支持N自己的显卡作为计算设备(可能他们认为cpu作为计算设备是在是鸡肋),但是AMD的platform则不仅支持AMD自己的设备,还支持Intel的CPU。

所以你要在程序开始查询机器所有支持的platform,再根据情况选择一个合适的paltform。(通常你要选择包含compute device的能力最强的那个platform,例如你发现客户机装的是N卡,而机器上有N的platform那么就选它了)

通过clGetPlatformInfo 这个函数还可以进一步的得到该平台的更多信息(名字、cl版本、实现者等等)

 

  3.查询device信息(在程序中这一步是可以不做的,但是可以用来判断platform的计算能力)

  //get device num

 err=clGetDeviceIDs(platforms[0],CL_DEVICE_TYPE_ALL,0,0,&num);

好的,关于从零开始学习OpenCL开发的第一篇文章,我们来探讨一下OpenCL的架构。 OpenCL是一种开放的并行计算框架,可以在不同的硬件平台上实现高性能的计算。它支持异构计算,因此可以同时使用CPU和GPU等不同类型的处理器进行计算。 OpenCL的架构主要分为两个部分:主机端和设备端。主机端是运行OpenCL应用程序的计算机,设备端是执行计算任务的处理器,如GPU、CPU或FPGA等。 主机端包含以下组件: 1. OpenCL平台:一个OpenCL平台可以包含多个设备,例如一个CPU和一个GPU。 2. OpenCL运行时:OpenCL运行时是一个软件库,负责管理设备端的计算资源并提供API给应用程序调用。 3. OpenCL编译器:OpenCL编译器将OpenCL C代码编译成可以在设备端执行的进制代码。 设备端包含以下组件: 1. 计算单元:计算单元是设备端的核心组件,它负责执行OpenCL内核中的指令。 2. 内存:设备端的内存用于存储数据和指令。 3. 命令队列:命令队列是主机端向设备端发送指令的缓冲区。 4. OpenCL内核:OpenCL内核是在设备端执行的函数,它由主机端代码编译而来,用于执行计算任务。 以上就是OpenCL的基本架构,主机端和设备端之间通过命令队列进行通信,主机端将OpenCL内核发送到设备端执行,设备端将计算结果返回给主机端。在后续的文章中,我们将深入了解如何使用OpenCL进行并行计算。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值