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

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目录等。

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

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

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

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

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

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

第二步是得到OpenCL设备,

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

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

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

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

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

Noiz Agent Noiz Agent

AI声音创作Agent平台

Noiz Agent 323 查看详情 Noiz Agent

—设备(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,厂商选择的缺省值被使用,这个函数也提供了一个回调机制给用户提供错误报告。

现在的代码如下:

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

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

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

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

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

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

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

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

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

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

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

 原文作者:迈克老狼

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/895357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 17:29:44
下一篇 2025年11月28日 17:30:40

相关推荐

  • CSS动画教程:手把手教你实现脉冲特效

    CSS动画教程:手把手教你实现脉冲特效,需要具体代码示例 引言:CSS动画是网页设计中常用的一种效果,它可以为网页增添活力和视觉吸引力。本篇文章将带您深入了解如何利用CSS实现脉冲特效,并提供具体的代码示例教您一步步完成。 一、了解脉冲特效脉冲特效是一种循环变化的动画效果,通常用在按钮、图标或其他元…

    2025年12月24日
    000
  • CSS动画教程:手把手教你实现流水流光特效

    CSS动画教程:手把手教你实现流水流光特效,需要具体代码示例 前言:CSS动画是网页设计中常用的技术,它使得网页更生动有趣,吸引用户的注意力。在这篇教程中,我们将会学习如何使用CSS实现一个流水流光的特效,并提供具体的代码示例。让我们开始吧! 第一步:HTML结构首先,我们需要创建一个基本的HTML…

    2025年12月24日
    000
  • word-wrap怎么自动换行?css强行自动换行教程

    本篇文章给大家带来的内容是关于word-wrap怎么自动换行?css强行自动换行教程,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 word-wrap介绍 word-wrap是设置对象内文字遇到对象顶边时是否采取换行排版布局。 1、语法 立即学习“前端免费学习笔记(深入)”; wo…

    2025年12月24日
    000
  • 用CSS实现网站变黑白色

    这篇文章主要介绍了关于用css实现网站变黑白色,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 以下为全站CSS代码.  html { filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } 使用方法:这段…

    好文分享 2025年12月24日
    000
  • 详解css加载会造成阻塞吗_CSS教程_CSS_网页制作

    这次给大家带来详解css加载会造成阻塞吗,css加载造成阻塞的注意事项有哪些,下面就是实战案例,一起来看一下。 终于考试完了,今天突然想起来前阵子找实习的时候,今日头条面试官问我,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?所以,接下来我就来对css加载对DOM树…

    2025年12月24日 好文分享
    000
  • 关于CSS3中选择符的实例详解

    英文原文: www.456bereastreet.com/archive/200601/css_3_selectors_explained/中文翻译: www.dudo.org/article.asp?id=197注:本文写于2006年1月,当时IE7、IE8和Firefox3还未发行,文中所有说的…

    好文分享 2025年12月23日
    000
  • 阐述什么是CSS3?

    网页制作Webjx文章简介:CSS3不是新事物,更不是只是围绕border-radius属性实现的圆角。它正耐心的坐在那里,已经准备好了首次登场,呷着咖啡,等着浏览器来铺上红地毯。            CSS3不是新事物,更不是只是围绕border-radius属性实现              …

    好文分享 2025年12月23日
    000
  • CSS教程(三)伪类——动态链接

    伪类可以看做是一种特殊的类选择符,是能被支持css的浏览器自动所识别的特殊选择符。它的最大的用处就是可以对链接在不同状态下定义不同的样式效果。 1.  语法 伪类的语法是在原有的语法里加上一个伪类(pseudo-class):selector:pseudo-class {property: valu…

    2025年12月23日
    000
  • CSS教程(四)如何在网页中插入CSS

    前两章我们了解了css的语法,但要想在浏览器中显示出效果,就要让浏览器识别并调用。当浏览器读取样式表时,要依照文本格式来读,这里介绍四种在页面中插入样式表的方法:链入外部样式表、内部样式表、导入外表样式表和内嵌样式。   链入外部样式表 链入外部样式表是把样式表保存为一个样式表文件,然后在页面中?l…

    2025年12月23日
    000
  • CSS教程(五)如何使用DW4创建CSS

    1. css styles面板 通过前面几章的学习,相信大家对css有了一定的了解,这一章我们来讲解如何利用dreamweaver4来创建css。首先运行dreamweaver4,启动后,选择菜单下的windows->css styles(或按shitf+f11),系统弹出css styles…

    2025年12月23日
    000
  • CSS教程(六) DW4中CSS属性详解

    在dreamweaver4的css样式里包含了w3c规范定义的所有css1的属性,dreamweaver4把这些属性分为type(类型)、background(背景)、block(块)、box(盒子)、border(边框)、 list(列表)、positioning(定位)、extensions(扩…

    2025年12月23日
    000
  • CSS教程(七) 滤镜

    css提供了一些内置的多媒体滤镜特效,使用这种技术可以把可视化的滤镜和转换效果添加到一个标准的html元素上,例如图片、文本容器、以及其他一些对象。dreamweaver4提供了16种滤镜可供选择,如下图: 下面,我们就来看看在dreamweaver4里如何方便的使用这些css滤镜。 建立一个自定义…

    2025年12月23日
    000
  • CSS教程(八) 简单介绍CSS结合JS的运用

    八、 简单介绍css结合js的运用(针对事件动作) 利用css配合javascript的可以做很多更酷的动态页面效果,在本教程的最后给大家简单介绍一下css配合js的应用。首先,我们要搞清楚事件和动作的概念。在客户端脚本中,javascript 通过对事件进行响应来获得与用户的交互。例如,当用户单击…

    2025年12月23日
    000
  • CSS教程(一)初识CSS

    css教程(一)认识css     dreamweaver4是现今最好的网站编辑工具之一,用它来给制作网页的css样式表会更简单、更方便。本教程教你如何利用dreamweaver4在页面中加入css,你不用死记硬背的记代码标记,也不用去看很厚的css手册,你就可以轻松自如的在网页中运用css。不过首…

    2025年12月23日
    000
  • 如何在html编辑代码_在HTML页面内编辑和运行代码块【代码】

    可在HTML页面内嵌入可交互代码编辑与执行功能,具体包括:一、CodeMirror+Function构造器实现JS即时运行;二、Monaco Editor配合Web Worker与vm2沙箱安全执行;三、iframe隔离预览HTML/CSS/JS;四、BrowserFS模拟本地文件系统。 如果您希望…

    2025年12月23日
    000
  • 记事本写完代码后怎么运行html_记事本代码运行html步骤【教程】

    将记事本编写的HTML代码保存为.html格式文件,通过“另存为”选择“所有文件”并添加.html扩展名;2. 双击或右键用浏览器打开该文件即可查看网页效果;3. 也可直接将文件拖拽至浏览器窗口快速预览;4. 熟悉命令行者可用cmd进入文件目录后输入start 文件名.html运行。 如果您已经使用…

    2025年12月23日
    000
  • 记事本的html代码怎么运行_记事本运html代码方法【教程】

    首先用记事本编写HTML代码,输入基础结构如标题和段落;接着在“另存为”时选择保存类型为“所有文件”,文件名设为myweb.html并采用UTF-8编码;然后双击保存的.html文件,浏览器将自动打开显示网页内容;若需修改,右键用记事本重新编辑并保存后刷新浏览器即可。 用记事本写好的HTML代码想要…

    2025年12月23日
    000
  • 如何在网页头部添加粒子特效并解决层叠覆盖问题

    本教程旨在解决在网页头部集成JavaScript粒子特效时,粒子画布覆盖背景图片和导航栏的问题。核心解决方案是利用CSS的`z-index`属性,将粒子画布置于较低的层级,从而确保背景和导航元素可见且可交互。文章将详细阐述`z-index`的工作原理、正确的CSS配置以及完整的代码示例,帮助开发者实…

    2025年12月23日
    000
  • Odoo表单视图中自定义JavaScript行为与事件绑定教程

    本教程详细介绍了如何在odoo中通过扩展其客户端框架来实现表单视图的自定义javascript行为和事件绑定。我们将学习如何利用`js_class`属性、继承`formcontroller`和`formview`来添加自定义事件监听器,例如对输入框的`keyup`事件进行响应,从而实现更复杂的业务逻…

    2025年12月23日
    000
  • studio怎么运行html文件_studio运行html文件方法【教程】

    Android Studio 非运行 HTML 理想工具,可通过安装 HTML Preview 插件实现预览;2. 最简单方式是右键文件在资源管理器中打开并用浏览器直接运行;3. 对于需 HTTP 服务的功能,推荐使用 Node.js 搭建本地服务器,通过 npx http-server 启动并在 …

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信