AMD OpenCL大学教程(8)

简介: 在本节,我们主要介绍OpenCL中buffer的使用,同时提供了两个个完整的例子,一个是图像的旋转,一个是矩阵乘法(非常简单,没有分块优化)。 1、创建OpenCL设备缓冲(buffer)    OpenCL设备使用的数据都存放在设备的buffer中[其实就是device memory中]。

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

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

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

 

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

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

image

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

 

2、图像旋转的例子

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

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

imageimage

在这个例子中,我使用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,大家可以尝试其它的值。

下面是程序的流程图:

image

在前面向量加法的例子中,我已经介绍了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下载。

image

 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
  
 
   
 

相关文章
|
算法 数据安全/隐私保护
一文详解 RSA 非对称加密算法
非对称加密算法指的是 加、解密使用不同的密钥,一把为公开的公钥,另一把为私钥。 公钥加密的内容只能由私钥进行解密,反之由私钥加密的内容只能由公钥进行解密。也就是说,这一对公钥、私钥都可以用来加密和解密,并且一方加密的内容只能由对方进行解密。
11516 1
|
9月前
|
编解码 物联网 测试技术
FLUX.2-Klein 4B/9B开源:亚秒级统一图像生成与编辑
Black Forest Labs开源FLUX.2 [klein]模型家族,兼具文生图、图像编辑与多参考生成能力,端到端推理低至0.5秒,4B版本仅需13GB显存,支持消费级GPU高效运行,量化后速度提升最高2.7倍,Apache 2.0许可商用友好。
5126 1
|
开发工具 Android开发
解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”
解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”
2022 0
|
网络架构 内存技术
OpenPose原理解析
Openpose论文原理总结
1310 0
|
安全 开发者 Python
Python的内存管理pymalloc
Python的内存管理pymalloc
|
人工智能 文字识别 算法
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
X-AnyLabeling是一款强大的辅助标注工具,集成了AI推理引擎和丰富功能,为图像数据工程师提供一站式解决方案。它支持图像和视频文件的自动标注,提供了包括矩形框、多边形在内的七种标注样式,适应多样化的训练场景需求。X-AnyLabeling内置了多种SOTA级AI模型,如YOLO、SAM系列等,并支持GPU加速和多种数据集格式的导入导出,确保高效的数据处理。此外,它还具备良好的跨平台兼容性,可在多种操作系统上运行,并提供详尽的帮助文档和社区支持,帮助用户轻松上手并解决使用过程中遇到的问题。
4176 2
打造全场景、跨领域、多模态的AI工作流 | 开源图像标注工具 X-AnyLabeling v2.4.0 正式发布!
|
算法 机器人 数据挖掘
LeetCode题目54:螺旋矩阵【python4种算法实现】
LeetCode题目54:螺旋矩阵【python4种算法实现】
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
3584 1
|
存储 人工智能 算法
极智AI | 一文看懂winograd卷积加速算法
本文详细解释了 winograd 算法加速卷积的实现原理。
2101 1
|
存储 人工智能 自然语言处理
企业级知识图谱的案例分享
近日,在深圳举办的2019中国知识图谱产业发展峰会上,中国人工智能知识图谱联盟(AICKI)正式发布了《2019知识图谱白皮书》。这份白皮书对中国知识图谱产业的发展现状、趋势和热点进行了解读,并对行业典型应用案例进行了详细分析。为了帮助行业人士更好地理解和应用知识图谱,就企业级知识图谱的应用案例进行分享。下面我们将从一个客户案例入手,与大家探讨企业级知识图谱在企业应用中的价值和挑战。

热门文章

最新文章