OpenCL并行计算学习笔记

用不上超算,就用GPU Computing吧

因为最近学习tensorflow, 就去买了张GTX1070,OpenCL就暂时搁置了。

最近发现GPU Computing是大势所趋啊,鉴于之前自己跑程序一跑就是一天的经历,因此学习并行计算也是性价比比较高的方式。

既然是GPU Computing,那肯定是使用GPU来进行运算了。现在市场上占有率最高的当然是NVIDIA,然后是AMD和Intel了。Intel做的是集成显卡,运算效率不高,一般GPU Computing主要使用的还是NVIDIA和AMD的显卡。

NVIDIA在GPU Computing这一方面可以说是先驱,推出了数款计算卡,性能超群,但价格不菲。我们退而求其次,NVIDIA的中高端游戏显卡也可以拿来用,同时也丰富下业余生活。而要使用NVIDIA的显卡,必须使用CUDA语言编写程序。对熟悉C++语言的同学,应该可以很快熟悉。

相对于OpenCL, CUDA的运行效率会更高。但是我选择OpenCL的原因嘛…

当然是因为我只有AMD的显卡了。OpenCL比CUDA开放,不仅支持AMD,也支持NVIDIA。

但是GPU Computing的主要难点不在于语言,而是编程逻辑有所不同。

在使用OpenCL编程时,第一步就是去建立host applicaton, host application在主机运行并负责给相连设备派送kernel。而每个host application需要5个数据结构:cl_device_id, cl_kernel, cl_program, cl_command_queue 和 cl_context.

其实OpenCL和打德州扑克很像,下面我以德州扑克为例来说一下这几个数据结构的关系。

  • 荷官(Dealer)和玩家(Player)在一张牌桌(Card Table)上,发牌员从牌堆里向一位或数位玩家发牌
  • 每个玩家收到牌后放在手里并开始分析怎么玩
  • 玩家之间不能互相交流,但是可以向荷官要牌或更改筹码
  • 荷官处理玩家的请求并决定牌局是否结束

OpenCL的数据结构和德州扑克有着类似的规则。

  • Device: OpenCL的device对应玩家,从host接受kernel。
  • Kernel: OpenCL的kernel对应扑克牌。
  • Program:一个OpenCL的program对应一局里的一盒牌
  • Command queue: 对应牌局里玩家的手。
  • Context:对应牌桌,有牌桌才能发牌。有了context,device才能接收kernel和传递数据。

但是需要注意的还有:

  1. OpenCL还需要一个platform才能使用GPU内的device。
  2. 不同于真正的德州扑克,OpenCL的host可以选择device的数量,也可以将同一个kernel发给不同的device,同时对分配kernel的次序也没有限制。
  3. Host还需要创建一个enqueue_commands的数据结构,告诉device如何处理kernel。

下一次会接着讲如何处理kernel。 有时间的话会更新一些tensorflow的学习笔记。

If you like my article, please feel free to donate!