0

0

AMD OpenCL 大学教程(2): OpenCL概述

php中文网

php中文网

发布时间:2016-06-10 15:12:13

|

1951人浏览过

|

来源于php中文网

原创

1、OpenCL架构 OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其它处理器,比如Cell处理器,DSP等。使用OpenCL编程,可以实现可移植的并行加速代码。[ 但由于各个OpenCL device不同的硬件性能,可能对于程序的优化还要考虑具体的硬件特性 ]

1、opencl架构

OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其它处理器,比如Cell处理器,DSP等。使用OpenCL编程,可以实现可移植的并行加速代码。[但由于各个OpenCL device不同的硬件性能,可能对于程序的优化还要考虑具体的硬件特性]。

通常OpenCL架构包括四个部分:

  • 平台模型(Platform Model)
  • 执行模型(Execution Model)
  • 内存模型(Memory Model)
  • 编程模型(Programming Model)

2、OpenCL平台模型

不同厂商的OpenCL实施定义了不同的OpenCL平台,通过OpenCL平台,主机能够和OpenCL设备之间进行交互操作。现在主要的OpenCL平台有AMD、Nvida,Intel等。OpenCL使用了一种Installable Client Driver模型,这样不同厂商的平台就能够在系统中共存。在我的计算机上就安装有AMD和Intel两个OpenCL Platform[现在的OpenCL driver模型不允许不同厂商的GPU同时运行]。

AMD OpenCL 大学教程(2): OpenCL概述

OpenCL平台通常包括一个主机(Host)和多个OpenCL设备(device),每个OpenCL设备包括一个或多个CU(compute units),每个CU包括又一个或多个PE(process element)。 每个PE都有自己的程序计数器(PC)。主机就是OpenCL运行库宿主设备,在AMD和Nvida的OpenCL平台中,主机一般都指x86 CPU。

对AMD平台来说,所有的CPU是一个设备,CPU的每一个core就是一个CU,而每个GPU都是独立的设备。

AMD OpenCL 大学教程(2): OpenCL概述

3、OpenCL编程的一般步骤

下面我们通过一个实例来了解OpenCL编程的步骤,假设我们用的是AMD OpenCL平台(因为本人的GPU是HD5730),安装了AMD Stream SDK 2.6,并在VS2008中设置好了include,lib目录等。

首先我们建立一个控制台程序,最初的代码如下:

<span> 1:</span> <span>#include</span> <span>"stdafx.h"</span>
<span> 2:</span> <span>#include</span> <CL/cl.h>
<span> 3:</span> <span>#include</span> <stdio.h>
<span> 4:</span> <span>#include</span> <stdlib.h>
<span> 5:</span> 
<span> 6:</span> <span>#pragma</span> <span>comment</span> (lib,<span>"OpenCL.lib"</span>)
<span> 7:</span> 
<span> 8:</span> <span>int</span> main(<span>int</span> argc, <span>char</span>* argv[])
<span> 9:</span> {
<span> 10:</span> <span>return</span> 0;
<span> 11:</span> }

第一步,我们要选择一个OpenCL平台,所用的函数就是

AMD OpenCL 大学教程(2): OpenCL概述

通常,这个函数要调用2次,第一次得到系统中可使用的平台数目,然后为(Platform)平台对象分配空间,第二次调用就是查询所有的平台,选择自己需要的OpenCL平台。代码比较长,具体可以看下AMD Stream SDK 2.6中的TemplateC例子,里面描述如何构建一个robust的最小OpenCL程序。为了简化代码,使程序看起来不那么繁琐,我直接调用该函数,选取系统中的第一个OpenCL平台,我的系统中安装AMD和Intel两家的平台,第一个平台是AMD的。另外,我也没有增加错误检测之类的代码,但是增加了一个status的变量,通常如果函数执行正确,返回的值是0。

<span> 1:</span> <span>#include</span> <span>"stdafx.h"</span>
<span> 2:</span> <span>#include</span> <CL/cl.h>
<span> 3:</span> <span>#include</span> <stdio.h>
<span> 4:</span> <span>#include</span> <stdlib.h>
<span> 5:</span> 
<span> 6:</span> <span>#pragma</span> <span>comment</span> (lib,<span>"OpenCL.lib"</span>)
<span> 7:</span> 
<span> 8:</span> <span>int</span> main(<span>int</span> argc, <span>char</span>* argv[])
<span> 9:</span> {
<span> 10:</span> cl_uint status;
<span> 11:</span> cl_platform_id platform;
<span> 12:</span> 
<span> 13:</span> status = clGetPlatformIDs( 1, &platform, NULL );
<span> 14:</span> 
<span> 15:</span> <span>return</span> 0;
<span> 16:</span> }

第二步是得到OpenCL设备

AMD OpenCL 大学教程(2): OpenCL概述

这个函数通常也是调用2次,第一次查询设备数量,第二次检索得到我们想要的设备。为了简化代码,我们直接指定GPU设备。

<span> 1:</span> <span>#include</span> <span>"stdafx.h"</span>
<span> 2:</span> <span>#include</span> <CL/cl.h>
<span> 3:</span> <span>#include</span> <stdio.h>
<span> 4:</span> <span>#include</span> <stdlib.h>
<span> 5:</span> 
<span> 6:</span> <span>#pragma</span> <span>comment</span> (lib,<span>"OpenCL.lib"</span>)
<span> 7:</span> 
<span> 8:</span> <span>int</span> main(<span>int</span> argc, <span>char</span>* argv[])
<span> 9:</span> {
<span> 10:</span> cl_uint status;
<span> 11:</span> cl_platform_id platform;
<span> 12:</span> 
<span> 13:</span> status = clGetPlatformIDs( 1, &platform, NULL );
<span> 14:</span> 
<span> 15:</span> cl_device_id device;
<span> 16:</span> 
<span> 17:</span> clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,
<span> 18:</span> 1,
<span> 19:</span> &device,
<span> 20:</span> NULL);
<span> 21:</span> 
<span> 22:</span> <span>return</span> 0;
<span> 23:</span> }

下面我们来看下OpenCL中Context的概念:

通常,Context是指管理OpenCL对象和资源的上下文环境。为了管理OpenCL程序,下面的一些对象都要和Context关联起来:

360智绘
360智绘

360智脑推出的AI绘画创作与分享平台

下载

—设备(Devices):执行Kernel程序对象。

—程序对象(Program objects): kernel程序源代码

Kernels:运行在OpenCL设备上的函数。

—内存对象(Memory objects): device处理的数据对象。

—命令队列(Command queues): 设备之间的交互机制。

注意:创建一个Context的时候,我们必须把一个或多个设备和它关联起来。对于其它的OpenCL资源,它们创建时候,也要和Context关联起来,一般创建这些资源的OpenCL函数的输入参数中,都会有context。

AMD OpenCL 大学教程(2): OpenCL概述

AMD OpenCL 大学教程(2): OpenCL概述

这个函数中指定了和context关联的一个或多个设备对象,properties参数指定了使用的平台,如果为NULL,厂商选择的缺省值被使用,这个函数也提供了一个回调机制给用户提供错误报告。

现在的代码如下:

<span> 1:</span> <span>#include</span> <span>"stdafx.h"</span>
<span> 2:</span> <span>#include</span> <CL/cl.h>
<span> 3:</span> <span>#include</span> <stdio.h>
<span> 4:</span> <span>#include</span> <stdlib.h>
<span> 5:</span> 
<span> 6:</span> <span>#pragma</span> <span>comment</span> (lib,<span>"OpenCL.lib"</span>)
<span> 7:</span> 
<span> 8:</span> <span>int</span> main(<span>int</span> argc, <span>char</span>* argv[])
<span> 9:</span> {
<span> 10:</span> cl_uint status;
<span> 11:</span> cl_platform_id platform;
<span> 12:</span> 
<span> 13:</span> status = clGetPlatformIDs( 1, &platform, NULL );
<span> 14:</span> 
<span> 15:</span> cl_device_id device;
<span> 16:</span> 
<span> 17:</span> clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,
<span> 18:</span> 1,
<span> 19:</span> &device,
<span> 20:</span> NULL);
<span> 21:</span> cl_context context = clCreateContext( NULL,
<span> 22:</span> 1,
<span> 23:</span> &device,
<span> 24:</span>                
<span> 25:</span> 
<span> 26:</span> <span>return</span> 0;
<span> 27:</span> }

接下来,我们要看下命令队列。在OpenCL中,命令队列就是主机的请求,在设备上执行的一种机制。

  • 在Kernel执行前,我们一般要进行一些内存拷贝的工作,比如把主机内存中的数据传输到设备内存中。

另外要注意的几点就是:对于不同的设备,它们都有自己的独立的命令队列命令队列中的命令(kernel函数)可能是同步的,也可能是异步的,它们的执行顺序可以是有序的,也可以是乱序的

AMD OpenCL 大学教程(2): OpenCL概述

命令队列在device和context之间建立了一个连接。

命令队列properties指定以下内容:

  • 是否乱序执行(在AMD GPU中,好像现在还不支持乱序执行)
  • 是否启动profiling。Profiling通过事件机制来得到kernel执行时间等有用的信息,但它本身也会有一些开销。

如下图所示,命令队列把设备和context联系起来,尽管它们之间不是物理连接。AMD OpenCL 大学教程(2): OpenCL概述

添加命令队列后的代码如下:

<span> 1:</span> <span>#include</span> <span>"stdafx.h"</span>
<span> 2:</span> <span>#include</span> <CL/cl.h>
<span> 3:</span> <span>#include</span> <stdio.h>
<span> 4:</span> <span>#include</span> <stdlib.h>
<span> 5:</span> 
<span> 6:</span> <span>#pragma</span> <span>comment</span> (lib,<span>"OpenCL.lib"</span>)
<span> 7:</span> 
<span> 8:</span> <span>int</span> main(<span>int</span> argc, <span>char</span>* argv[])
<span> 9:</span> {
<span> 10:</span> cl_uint status;
<span> 11:</span> cl_platform_id platform;
<span> 12:</span> 
<span> 13:</span> status = clGetPlatformIDs( 1, &platform, NULL );
<span> 14:</span> 
<span> 15:</span> cl_device_id device;
<span> 16:</span> 
<span> 17:</span> clGetDeviceIDs( platform, CL_DEVICE_TYPE_GPU,
<span> 18:</span> 1,
<span> 19:</span> &device,
<span> 20:</span> NULL);
<span> 21:</span> cl_context context = clCreateContext( NULL,
<span> 22:</span> 1,
<span> 23:</span> &device,
<span> 24:</span> NULL, NULL, NULL);
<span> 25:</span> 
<span> 26:</span> cl_command_queue queue = clCreateCommandQueue( context,
<span> 27:</span> device,
<span> 28:</span> CL_QUEUE_PROFILING_ENABLE, NULL );
<span> 29:</span> 
<span> 30:</span> <span>return</span> 0;
<span> 31:</span> }

 原文作者:迈克老狼

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

286

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

126

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

42

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

19

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

23

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

421

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

51

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
JavaScript模块化教程
JavaScript模块化教程

共10课时 | 1.1万人学习

Node.js 教程
Node.js 教程

共57课时 | 11.5万人学习

CSS3 教程
CSS3 教程

共18课时 | 5.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号