大数据|数据流技术在GPU和大数据处理中的应用( 三 )


流处理器对应的程序执行模型采用的是两级编程方式 , 分为流程序和内核(kernel)程序 。 流程序控制整个程序的执行过程 , 将数据组织成流的形式;kernel程序负责对流中的数据进行并行处理 , 将数据映射到大规模计算阵列中 , 在流计算中 , 核心程序的概念可以认为是宏观上的数据流节点 。 只要流和计算阵列就绪就可以执行指令 , 而且kernel的输出流通常会作为下一个kernel的输入流 。 在流计算模型中 , 所谓的流就是一组有序的数据记录(record) 。 记录由相关数据的集合组成 。 流记录可以是任意数据类型 , 但同一个流中的记录必须是同类型的 。
2.3 GPUGPU是目前大数据和智能计算时代的宠儿 , 可以说在智能计算领域 , GPU占据了主导地位 。 GPU的发展和成功都离不开数据流技术 , 从硬件的角度来看 , GPU的执行单元是由流处理器组成的 , 通过堆叠大量同构的流处理器来提供超强的计算能力;从软件的角度看 , GPU的kernel执行模式是典型的数据流执行机制 , 不同的kernel的执行顺序是由资源和输入输出数据是否就绪决定的 。 在kernel的执行过程中 , 不同线程的执行顺序又是不确定的 。
起初 , GPU通常只是作为一种图形图像处理专用设备而存在的 , 采用顶点编程的方式 。 由于其高度专用编程接口的特点 , 当时的GPU在其他计算领域的应用是十分受限的 。 之后NVIDIA公司引入2个关键的技术解决了这一问题 。 在硬件结构上 , NVIDIA的GPU采用统一的计算体系结构 , 由若干个同构的流处理器组成计算阵列 , 程序员看到的也不再是特定的图形处理单元 , 而是通用的大规模并行处理器 。 在软件层面 , 采用CUDA[9] , 大大简化了GPU的编程 , 程序员不需要关注传统应用程序接口(application programming interface , API) 。 除了NVIDIA之外 , AMD和英特尔(Intel)也都有自己的图形图像处理器 , 但是目前都无法撼动NVIDIA在GPU领域的主导地位 。 本文以NVIDIA的GPU为案例进行分析 。
NVIDIA公司GPU的成功很大程度上是因为借鉴了流处理器的思想 , Imagine的负责人Dally W J教授加入NVIDIA公司成为首席科学家极大地推动了流计算在GPU领域的使用 。 图2是一个典型的NVIDIA公司的GPU架构 , 它使用SM来构建整个设备 , 不同系列的GPU中每个SM包含的流处理器数量不等 , 由原来的8个到32个 , 再到如今的192个 。 每个SM是完全独立可执行的 , 在GPU的内部 , 相当于集成了很多同构的数据流计算节点 。 在存储层次方面 ,GPU涉及片上存储空间和片外存储空间 。 片上存储空间包括指令cache、寄存器、可配置的共享存储器和L1 cache以及L2 cache 。 不同于典型的流处理器 , GPU采用软件可管理的cache模式 , 既可以显示管理数据 , 也可以在一定程度上利用cache的局域性 , 使得GPU可以适应不同的应用场景 。 GPU的片外存储称为全局存储器(global memory) , 用来存储大量的数据 。

大数据|数据流技术在GPU和大数据处理中的应用
本文插图

图1 Imagine 流处理器体系结构

大数据|数据流技术在GPU和大数据处理中的应用
本文插图

图2 GPU的典型架构
CUDA是由NVIDIA开发的一种面向GPU通用计算的并行编程模型 , 支持C/C++、Fortran等高级语言 。 CUDA编程模型采用host+device的主从模式 , 在CPU上执行控制流 , 在GPU端执行计算流 , 其执行模式和线程组织层次如图3所示 。 主机(host)CPU程序主要负责执行控制流复杂的串行程序段 , 并负责设备端计算kernel的调用以及主机与设备之间的数据传输等操作 。 kernel程序负责执行并行度很高的计算任务 。 当计算kernel被调用时 , 将根据执行配置变量<<>>创建并组织线程在设备上的执行层次 。 kernel程序通过线程级和线程块级两级并行对应用进行加速 。 线程是细粒度的并行层次 , 它执行在流处理器上 , 大量的线程可以同时执行 , 但是线程的执行顺序并不是确定的 , 每一个线程通过自己的ID读取对应的数据进行处理 。 线程的ID刻画了数据流计算模型中不同数据的令牌的角色 , 使得即使线程的执行是乱序的 , 也仍然能够保证程序的正确性 。 CUDA还提供了多个kernel同时执行的机制 , 就是为了保证流处理器的计算负载达到饱和状态 。


推荐阅读