AMD OpenCL大学教程(8)

在本节,我们主要介绍OpenCL中buffer的使用,同时提供了两个个完整的例子,一个是图像的旋转,一个是矩阵乘法(非常简单,没有分块优化)。

1、创建OpenCL设备缓冲(buffer)

   OpenCL设备使用的数据都存放在设备的buffer中[其实就是device memory中]。我们用下面的代码创建buffer对象:


    如果host_ptr指向一个有效的host指针,则创建一个buffer对象的同时会实现隐式的数据拷贝(会在kernel函数进入队列时候,把host_prt中的数据从host memory拷贝到设备内存对象bufferobj中)。

    我们可以通过flags参数指定buffer对象的属性。

   函数clEnqueueWriteBuffer()用来实现显示的数据拷贝,即把host memory中的数据拷贝到device meomory中。


2、图像旋转的例子

   下面是一个完整的OpenCL例子,实现图像的旋转。在这个例子中,我把美丽的Lenna旋转了90度。

下面是原始图像和旋转后的图像(黑白)

在这个例子中,我使用FreeImage库,可以从FreeImage网站或者我的code工程中下载。

http://code.google.com/p/imagefilter-opencl/downloads/detail?name=Dist.rar&can=2&q=#makechanges

   图像旋转是指把定义的图像绕某一点以逆时针或顺时针方向旋转一定的角度,通常是指绕图像的中心以逆时针方向旋转。

假设图像的左上角为(left, top),右下角为(right, bottom),则图像上任意点(x0, y0)绕其中心(xcenter, ycenter)逆时针旋转angle角度后,新的坐标位置(x′, y′)的计算公式为:

xcenter = (right - left + 1) / 2 + left;

ycenter = (bottom - top + 1) / 2 + top;

x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;

y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;

下面给出kernel的代码:





















src_data为原始图像(灰度图)数据,dest_data为旋转后的图像数据。W、H分别为图像的高度和宽度。sinTheta和cosTheta是旋转参数。我在代码中实现了旋转90度,所以sinTheta为1,cosTheta为0,大家可以尝试其它的值。

下面是程序的流程图:

在前面向量加法的例子中,我已经介绍了OpenCL一些基本的步骤。

  1. 创建platform对象
  2. 创建GPU设备
  3. 创建contex
  4. 创建命令队列
  5. 创建缓冲对象,代码如下:
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  6. 创建程序对象
  7. 编译程序对象
  8. 创建Kernel对象
  9. 设置kernel参数
  10. 执行kernel
  11. 数据拷贝回host memory,我采用映射memory的方式













   kernel执行时间的计算后面教程会有详细介绍,但在本节中,我们会给出通过事件机制来得到kernel执行时间,首先要在创建队列时候,使用CL_QUEUE_PROFILING_ENABLE参数,否则计算的kernel运行时间是0。

   下面是代码:









完整的程序代码:





































































































































































































































感兴趣的朋友可以从http://code.google.com/p/imagefilter-opencl/downloads/detail?name=amdunicourseCode2.zip&can=2&q=#makechanges下载完整代码。

注意代码运行后,会在程序目录生成lenna_rotate.jpg,这时gpu执行的结果,另外还有一个cpu_lenna_rotate.jpg这是CPU执行的结果。

3、一个矩阵乘法的例子

    在amd的slides中,本节还讲了一个简单的,没有优化的矩阵乘法,一共才两页ppt,所以我也不在这儿详细讲述了,…但简单介绍还是需要的。







上面的代码是矩阵乘法的例子,有三重循环,下面我们只给出kernel代码,完整程序请从:http://code.google.com/p/imagefilter-opencl/downloads/detail?name=amdunicodeCode3.zip&can=2&q=#makechanges下载。




















				
时间: 2024-09-20 12:10:17

AMD OpenCL大学教程(8)的相关文章

AMD OpenCL大学教程(9)

    本节主要讲述GPU的memory架构.优化基于GPU device的kernel程序时,我们需要了解很多GPU的memory知识,比如内存合并,bank conflit(冲突)等等,这样才能针对具体算法做一些优化工作. 1.GPU总线寻址介绍    假定X是一个指向整数(32位整数)数组的指针,数组的首地址为0x00001232.一个线程要访问元素X[0],    int tmp = X[0];        假定memory总线宽度为256位(HD5870就是如此,即为32字节),因为

AMD OpenCL大学课程(2)

1.OpenCL架构       OpenCL可以实现混合设备的并行计算,这些设备包括CPU,GPU,以及其它处理器,比如Cell处理器,DSP等.使用OpenCL编程,可以实现可移植的并行加速代码.[但由于各个OpenCL device不同的硬件性能,可能对于程序的优化还要考虑具体的硬件特性].    通常OpenCL架构包括四个部分: 平台模型(Platform Model) 执行模型(Execution Model) 内存模型(Memory Model) 编程模型(Programming

AMD OpenCL大学课程(11)

性能优化 1.线程映射    所谓线程映射是指某个线程访问哪一部分数据,其实就是线程id和访问数据之间的对应关系. 合适的线程映射可以充分利用硬件特性,从而提高程序的性能,反之,则会降低性能.    请参考Static Memory Access Pattern Analysis on a Massively Parallel GPU这篇paper,文中讲述线程如何在算法中充分利用线程映射.这是我在google中搜索到的下载地址:http://www.ece.neu.edu/~bjang/pat

AMD OpenCL大学课程(5)

OpenCL内存模型     OpenCL的内存模型定义了各种各样内存类型,各种内存模型之间有层级关系.各种内存之间的数据传输必须是显式进行的,比如从host memory到device memory,从global memory到local memory等等.     WorkGroup被映射到硬件的CU上执行(在AMD 5xxx系列显卡上,CU就是simd,一个simd中有16个pe),OpenCL并不提供各个workgroup之间的一致性,如果我们需要在各个workgroup之间共享数据或

AMD OpenCL大学课程(6)

GPU架构 内容包括: 1.OpenCLspec和多核硬件的对应关系 AMD GPU架构 Nvdia GPU架构 Cell Broadband Engine 2.一些关于OpenCL的特殊主题 OpenCL编译系统 Installable client driver   首先我们可能有疑问,既然OpenCL具有平台无关性,我们为什么还要去研究不同厂商的特殊硬件设备呢? 了解程序中的循环和数据怎样映射到OpenCL Kernel中,便于我们提高代码质量,获得更高的性能. 了解AMD和Nvdia显卡

AMD OpenCL大学课程(7)

6.Nvdia GPU Femi架构 GTX480-Compute 2.0 capability: 有15个core或者说SM(Streaming Multiprocessors ). 每个SM,一般有32 cuda处理器. 共480个cuda处理器. 带ECC的global memory 每个SM内的线程按32个单位调度执行,称作warp.每个SM内有2个warp发射单元. 一个cuda核由一个ALU和一个FPU组成,FPU是浮点处理单元. SIMT和SIMD SIMT是指单指令.多线程. 硬

AMD OpenCL大学课程(12) 性能优化案例NBody

    本节主要介绍NBody算法的OpenCL性能优化. 1.NBody     NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统.每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果.      上图为一个粒子模拟星系的图片:Source: THE GALAXY-CLUSTER-SUPERCLUSTER CONNECTION,http://www.casca.ca/ecass/issues/1997-DS/West/west-bil.html    由于每个粒子之间都

AMD OpenCL大学课程(10)

GPU线程及调度      本节主要讲述OpenCL中的Workgroup如何在硬件设备中被调度执行.同时也会讲一下同一个Workgroup中的workitem,如果它们执行的指令发生diverage(就是执行指令不一致)对性能的影响.学习OpenCL并行编程,不仅仅是对OpenCL Spec本身了解,更重要的是了解OpenCL硬件设备的特性,现阶段来说,主要是了解GPU的的架构特性,这样才能针对硬件特性优化算法.现在OpenCL的Spec是1.1,随着硬件的发展,相信OpenCL会支持更多的并

AMD OpenCL大学课程(13) OpenCL扩展

1.OpenCL扩展      OpenCL扩展是指device支持某种特性,但这中特性并不是OpenCL标准的一部分.通过扩展,厂商可以给device增加一些新的功能,而不用考虑兼容性问题.现在各个厂商在OpenCL的实现中或多或少的使用了自己的扩展.      扩展的类型分为三种: Khronos OpenCL工作组批准的扩展,这种要经过一致性测试,可能会被增加到新版本的OpenCL规范中.这种扩展都以cl_khr作为扩展名. 外部扩展, 以cl_ext为扩展名.这种扩展是由2个或2个以上的