本节书摘来异步社区《OpenCL实战》一书中的第1章,第1.3节,作者: 【美】Matthew Scarpino 译者: 陈睿 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 类比:OpenCL处理和纸牌游戏
在最开始学习OpenCL的时候,我经常会被那些奇怪的数据结构以及各式各样的术语所吓到。对于我而言,要记住这些术语所包含的内容以及相互间的关系并非易事,所以我采用了类比学习的方法,把OpenCL应用程序的运行过程比作打扑克牌。这看起来很奇怪,但个中缘由,由我慢慢道来。
扑克游戏的结构总是一张牌桌,一个庄家加上一个或多个玩家再配上一副纸牌。玩家之间并没有关系,他们只是向庄家要牌,或是增加赌注。庄家挨个询问玩家的请求,游戏结束之后,庄家便会查看手牌,判定胜负。
在这个类比中,庄家扮演的是OpenCL主机的角色,每个玩家则好比OpenCL兼容设备,而桌子就相当于是上下文,每副纸牌就相当于是一个内核程序。每个玩家的手牌就像是一个指令序列。表1.2更清楚地说明了纸牌游戏和OpenCL应用程序的运行过程间的类比关系。
为了让这个类比更直观,图1.2所示的是有4个玩家时的卡牌游戏的情景,每个人的手牌是4张。我希望通过图1.1和图1.2,让这个类比更加的直观、易懂。
在下面的几个章节里,我们还会回过头来再考察这个类比,并补充新的内容。这个类比虽然能让我们可以更直观地了解OpenCL的整个运行过程,但还是有些问题,下面仅列举出我所认为的六点最严重的不足:
- 类比并没有提及平台。而平台指的是标识OpenCL不同实现的数据结构。平台也为访问设备提供了方法。例如,你可以通过Nvidia的平台来访问Nvidia设备。
- 纸牌游戏中,庄家并不能选择牌桌上的玩家,但是OpenCL主机却要决定将哪些设备放入上下文之中。
- 纸牌游戏中,庄家并不能给不同的玩家派发同样的纸牌,但是OpenCL主机却可以将同样的内核发送到不同设备的指令序列中。
- 类比并没有提及数据以及如何针对OpenCL兼容设备进行数据划分。OpenCL兼容设备往往包含有很多个处理单元,每个处理单元只负责处理一部分数据。主机设定完数据的维度和处理单元的数量后,数据的划分便开始运行。
- 纸牌游戏中,庄家分发纸牌给玩家,每个玩家各自负责整理自己的手牌。而在OpenCL中,主机完成内核和执行指令入指令序列之后,每个设备默认的任务执行顺序与内核入列的顺序一致。
- 纸牌游戏中,庄家采用的是轮循调度的方法来发牌,而OpenCL对内核发送的方法并无限制。
如果你还是不大适应OpenCL的术语,别担心,第二章我们会深入地透过代码来了解这些数据结构。毕竟用这些东西编出代码才是王道。下一节我们来看看OpenCL代码究竟是何模样。