1.并行性
在应用程序中有两种基本的并行类型:
- 任务并行:当许多任务或函数可以独立地、大规模地并行执行时,这就是任务并行。任务并行的重点在于利用多核系统对任务进行分配。
- 数据并行:当可以同时处理许多数据时,这就是数据并行。数据并行的重点在于利用多核系统对数据进行分配。(CUDA编程非常适合解决数据并行计算的问题)
数据并行程序设计的第一步是把数据依据线程进行划分
数据划分方法:
- 块划分(block partitioning)
- 一组连续的数据被分到一个块内,每个数据块通常具有相同的大小
- 每个数据块以任意次序被安排给一个线程,线程通常在同一时间只处理一个数据块。
- 这种方式简化了同步和调度的问题,因为每个线程独立工作在自己的数据块上。
- 块划分适合每个线程处理大块连续数据的任务
- 周期划分(cyclic partitioning)
- 更少的数据被分到一个块内。
- 相邻的线程处理相邻的数据块,每个线程可以处理多个数据块。这些数据块之间通常是不连续的
- 为一个待处理的线程选择一个新的块,就意味着要跳过和现有线程一样多的数据块。
- 这种划分方式可以提高缓存的利用率,并可能减少内存访问延迟。
- 周期划分更适合于需要细粒度并行和数据局部性优化的场景
![](https://i-blog.csdnimg.cn/direct/b6b2435821e84d579e46af75da8378f1.png)
2. 计算机架构
弗林分类法(Flynn’s Taxonomy),它根据指令和数据进入CPU的方式,将计算机架构分为4种不同的类型。
- 单指令单数据(SISD):一种串行架构。在这种计算机上只有一个核心。在任何时间点上只有一个指令流在处理一个数据流。
- 单指令多数据(SIMD):一种并行架构类型。在这种计算机上有多个核心。在任何时间点上所有的核心只有一个指令流处理不同的数据流。向量机是一种典型的SIMD类型的计算机,现在大多数计算机都采用了SIMD架构。SIMD最大的优势或许就是,在CPU上编写代码时,程序员可以继续按串行逻辑思考但对并行数据操作实现并行加速,而其他细节则由编译器来负责。
- 多指令单数据(MISD)
- 多指令多数据(MIMD):是一种并行架构,在这种架构中,多个核心使用多个指令流来异步处理多个数据流,从而实现空间上的并行性。许多MIMD架构还包括SIMD执行的子组件。
根据内存组织方式,将计算机架构分为两种类型:
- 分布式内存的多节点系统:由许多网络连接的处理器构成的。每个处理器有自己的本地内存,而且处理器之间可以通过网络进行通信。集群。
- 共享内存的多处理器系统:由许多个处理器组成。这些处理器要么是与同一个物理内存相关联),要么共用一个低延迟的链路(如PCI-Express或PCIe)。多核系统->众核系统
![](https://i-blog.csdnimg.cn/direct/df91f20d7a134f3c878bc30b42fe7bfe.png)
![](https://i-blog.csdnimg.cn/direct/4dd9123e88084525ac8e01e7b6bee176.png)
计算机性能衡量标准:
- 延迟是一个操作从开始到完成所需要的时间,常用微秒来表示。
- 带宽是单位时间内可处理的数据量,通常表示为MB/s或GB/s。
- 吞吐量是单位时间内成功处理的运算数量,通常表示为gflops(即每秒十亿次的浮点运算数量),特别是在重点使用浮点计算的科学计算领域经常用到。
![CUDA坐标系](https://i-blog.csdnimg.cn/direct/812052fc35f747bea4ca71a8f3661263.png)
3. 异构计算
GPU代表了一种众核架构,几乎包括了所有并行结构:多线程、MIMD(多指令多数据)、SIMD(单指令多数据),以及指令级并行。NVIDIA公司称这种架构为SIMT(单指令多线程)。
CPU与GPU区别与联系:
- CPU核心比较重,用来处理非常复杂的控制逻辑,以优化串行程序执行。控制密集型任务。作系统必须交替线程使用启用或关闭CPU执行通道以提供多线程处理功能。上下文的切换缓慢且开销大。四核CPU上可以同时运行16个线程,如果CPU支持超线程可支持多至32个线程。
- GPU核心较轻,用于优化具有简单控制逻辑的数据并行任务,注重并行程序的吞吐量。数据计算密集型任务。NVIDIA GPU在每个多处理器上最多可以并发支持1536个同时活跃的线程。有16个多处理器的GPU,可以并发支持超过24000个同时活跃的线程。
- CPU和GPU是两个独立的处理器,它们通过单个计算节点中的PCI-Express总线相连。GPU不是一个独立运行的平台而是CPU的协处理器。因此CPU所在的位置被称作主机端而GPU所在的位置被称作设备端。
![](https://i-blog.csdnimg.cn/direct/f664b934b1d74fd8afc1f4d519a1dff3.png)
为了支持使用CPU+GPU异构系统架构来执行应用程序,NVIDIA设计了一个被称为CUDA的编程模型。
4. 编译器
- 主机代码是标准的C代码,使用C编译器进行编译。
- 设备代码,也就是核函数,是用扩展的带有标记数据并行函数关键字的CUDA C语言编写的。
- 设备代码通过nvcc进行编译。NVIDIA的CUDA nvcc编译器在编译过程中将设备代码从主机代码中分离出来。
- 在链接阶段,在内核程序调用和显示GPU设备操作中添加CUDA运行时库。
![](https://i-blog.csdnimg.cn/direct/c124ddb0369e454f9bec3d76ff0d39e6.png)