OpenCL 2.0 异构计算 [第三版] (中文)
  • Introduction
  • 序言
  • 第1章 简介异构计算
    • 1.1 关于异构计算
    • 1.2 本书目的
    • 1.3 并行思想
    • 1.4 并发和并行编程模型
    • 1.5 线程和共享内存
    • 1.6 消息通讯机制
    • 1.7 并行性的粒度
    • 1.8 使用OpenCL进行异构计算
    • 1.9 本书结构
  • 第2章 设备架构
    • 2.1 介绍
    • 2.2 硬件的权衡
    • 2.3 架构设计空间
    • 2.4 本章总结
  • 第3章 介绍OpenCL
    • 3.1 简介OpenCL
    • 3.2 OpenCL平台模型
    • 3.3 OpenCL执行模型
    • 3.4 内核和OpenCL编程模型
    • 3.5 OpenCL内存模型
    • 3.6 OpenCL运行时(例子)
    • 3.7 OpenCL C++ Wapper向量加法
    • 3.8 CUDA编程者使用OpenCL的注意事项
  • 第4章 OpenCL案例
    • 4.1 OpenCL实例
    • 4.2 直方图
    • 4.3 图像旋转
    • 4.4 图像卷积
    • 4.5 生产者-消费者
    • 4.6 基本功能函数
    • 4.7 本章总结
  • 第5章 OpenCL运行时和并发模型
    • 5.1 命令和排队模型
    • 5.2 多命令队列
    • 5.3 内核执行域:工作项、工作组和NDRange
    • 5.4 原生和内置内核
    • 5.5 设备端排队
    • 5.6 本章总结
  • 第6章 OpenCL主机端内存模型
    • 6.1 内存对象
    • 6.2 内存管理
    • 6.3 共享虚拟内存
    • 6.4 本章总结
  • 第7章 OpenCL设备端内存模型
    • 7.1 同步和交互
    • 7.2 全局内存
    • 7.3 常量内存
    • 7.4 局部内存
    • 7.5 私有内存
    • 7.6 统一地址空间
    • 7.7 内存序
    • 7.8 本章总结
  • 第8章 异构系统下解析OpenCL
    • 8.1 AMD FX-8350 CPU
    • 8.2 AMD RADEON R9 290X CPU
    • 8.3 OpenCL内存性能的考量
    • 8.4 本章总结
  • 第9章 案例分析:图像聚类
    • 9.1 图像聚类简介
    • 9.2 直方图的特性——CPU实现
    • 9.3 OpenCL实现
    • 9.4 性能分析
    • 9.5 本章总结
  • 第10章 OpenCL的分析和调试
    • 10.1 设置本章的原因
    • 10.2 使用事件分析OpenCL代码
    • 10.3 AMD CodeXL
    • 10.4 如何使用AMD CodeXL
    • 10.5 使用CodeXL分析内核
    • 10.6 使用CodeXL调试OpenCL内核
    • 10.7 使用printf调试
    • 10.8 本章总结
  • 第11章 高级语言映射到OpenCL2.0 —— 从编译器作者的角度
    • 11.1 简要介绍现状
    • 11.2 简单介绍C++ AMP
    • 11.3 编译器的目标 —— OpenCL 2.0
    • 11.4 C++ AMP与OpenCL对比
    • 11.5 C++ AMP的编译流
    • 11.6 编译之后的C++ AMP代码
    • 11.7 OpenCL 2.0提出共享虚拟内存的原因
    • 11.8 编译器怎样支持C++ AMP的线程块划分
    • 11.9 地址空间的推断
    • 11.10 优化数据搬运
    • 11.11 完整例子:二项式
    • 11.12 初步结果
    • 11.13 本章总结
  • 第12章 WebCL:使用OpenCL加速Web应用
    • 12.1 介绍WebCL
    • 12.2 如何使用WebCL编程
    • 12.3 同步机制
    • 12.4 WebCL的交互性
    • 12.5 应用实例
    • 12.6 增强安全性
    • 12.7 服务器端使用WebCL
    • 12.8 WebCL的状态和特性
  • 第13章 其他高级语言中OpenCL的使用
    • 13.1 本章简介
    • 13.2 越过C和C++
    • 13.3 Haskell中使用OpenCL
    • 13.4 本章总结
Powered by GitBook
On this page

Was this helpful?

  1. 第9章 案例分析:图像聚类

9.4 性能分析

为了展示不同的内核实现对于性能的影响,我们将这些内核都在Radeon HD 7970 GPU上执行了一遍。为了展示对不同数据大小的性能优化,我们也生成除了对应的SURF描述符和集群质心。生成的SURF描述符数量为4096,16384和65536。同时,对应质心的数量为16,64和256。我们选取数量较大的SURF特征,是因为对于一张高分辨率的图来说,通常都包含成千上万个特征。不过,对于质心来说其数量就相对较少,如果质心的数量过多会影响图像分类的准确度。

这里的性能数据是由相应的性能分析工具给出,这里我们使用了AMD公司的CodeXL,第10章中我们会对该工具进行介绍。本章主要描述对于OpenCL内核代码进行优化后的性能情况。这里还需要注意的是,目标平台的架构对于优化代码来说也有很大的影响。

9.4.1 GPU性能

我们将GPU1内核作为OpenCL内核实现的基线。在使用GPU2处理描述符和质心前,我们是用到了矩阵转置对描述符进行了转置操作。转置操作属于另外一个内核,为了避免这个因素影响我们之后优化的内核,这里将转置的时间单独列出来,在表9.1中展示。那么第二个内核,也就是直方图内核的性能数据在表9.2中展示。

表9.1 转置内核执行的时间

特征数量

转置内核耗时(ms)

4096

0.05

16,384

0.50

65,536

2.14

表9.2 直方图——不同内核实现的耗时统计

集群数量

SURF描述符数量

GPU1

GPU2

GPU3

GPU4

GPU5

8

4096

0.41

0.27

0.10

0.17

0.09

8

16,348

3.60

0.28

0.17

0.69

0.19

8

65,536

15.36

1.05

0.59

1.31

0.74

16

4096

0.77

0.53

0.19

0.28

0.14

16

16,348

7.10

0.53

0.32

0.57

0.29

16

65,536

30.41

1.47

1.17

2.26

1.12

64

4096

6.00

3.53

1.34

1.00

0.43

64

16,348

28.28

2.11

1.20

2.96

0.86

64

65,536

122.09

5.80

4.65

9.04

3.87

128

4096

4.96

4.04

1.47

1.95

0.81

128

16,348

55.70

4.27

2.40

5.89

1.61

128

65.536

243.30

11.63

9.29

17.46

6.43

256

4096

10.49

8.06

2.84

4.35

1.57

256

16,348

109.67

8.62

4.77

11.44

3.13

256

65,536

488.54

23.28

18.71

34.73

13.97

Previous9.3 OpenCL实现Next9.5 本章总结

Last updated 6 years ago

Was this helpful?