CUDA编程(零)--异构并行计算

1.并行性

在应用程序中有两种基本的并行类型:

  • 任务并行:当许多任务或函数可以独立地、大规模地并行执行时,这就是任务并行。任务并行的重点在于利用多核系统对任务进行分配。
  • 数据并行:当可以同时处理许多数据时,这就是数据并行。数据并行的重点在于利用多核系统对数据进行分配。(CUDA编程非常适合解决数据并行计算的问题)

数据并行程序设计的第一步是把数据依据线程进行划分

数据划分方法:

  • 块划分(block partitioning)
    • 一组连续的数据被分到一个块内,每个数据块通常具有相同的大小
    • 每个数据块以任意次序被安排给一个线程,线程通常在同一时间只处理一个数据块。
    • 这种方式简化了同步和调度的问题,因为每个线程独立工作在自己的数据块上。
    • 块划分适合每个线程处理大块连续数据的任务
  • 周期划分(cyclic partitioning)
    • 更少的数据被分到一个块内。
    • 相邻的线程处理相邻的数据块,每个线程可以处理多个数据块。这些数据块之间通常是不连续的
    • 为一个待处理的线程选择一个新的块,就意味着要跳过和现有线程一样多的数据块。
    • 这种划分方式可以提高缓存的利用率,并可能减少内存访问延迟。
    • 周期划分更适合于需要细粒度并行和数据局部性优化的场景
数据划分方法

2. 计算机架构

弗林分类法(Flynn’s Taxonomy),它根据指令和数据进入CPU的方式,将计算机架构分为4种不同的类型。

  • 单指令单数据(SISD):一种串行架构。在这种计算机上只有一个核心。在任何时间点上只有一个指令流在处理一个数据流。
  • 单指令多数据(SIMD):一种并行架构类型。在这种计算机上有多个核心。在任何时间点上所有的核心只有一个指令流处理不同的数据流。向量机是一种典型的SIMD类型的计算机,现在大多数计算机都采用了SIMD架构。SIMD最大的优势或许就是,在CPU上编写代码时,程序员可以继续按串行逻辑思考但对并行数据操作实现并行加速,而其他细节则由编译器来负责。
  • 多指令单数据(MISD)
  • 多指令多数据(MIMD):是一种并行架构,在这种架构中,多个核心使用多个指令流来异步处理多个数据流,从而实现空间上的并行性。许多MIMD架构还包括SIMD执行的子组件。

根据内存组织方式,将计算机架构分为两种类型:

  • 分布式内存的多节点系统:由许多网络连接的处理器构成的。每个处理器有自己的本地内存,而且处理器之间可以通过网络进行通信。集群。
  • 共享内存的多处理器系统:由许多个处理器组成。这些处理器要么是与同一个物理内存相关联),要么共用一个低延迟的链路(如PCI-Express或PCIe)。多核系统->众核系统
多节点系统
共享内存的多处理器系统

计算机性能衡量标准:

  • 延迟是一个操作从开始到完成所需要的时间,常用微秒来表示。
  • 带宽是单位时间内可处理的数据量,通常表示为MB/s或GB/s。
  • 吞吐量是单位时间内成功处理的运算数量,通常表示为gflops(即每秒十亿次的浮点运算数量),特别是在重点使用浮点计算的科学计算领域经常用到。
CUDA坐标系
标题CUDA坐标系

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所在的位置被称作设备端。
CPU与GPU的连接

为了支持使用CPU+GPU异构系统架构来执行应用程序,NVIDIA设计了一个被称为CUDA的编程模型。

4. 编译器

  • 主机代码是标准的C代码,使用C编译器进行编译。
  • 设备代码,也就是核函数,是用扩展的带有标记数据并行函数关键字的CUDA C语言编写的。
  • 设备代码通过nvcc进行编译。NVIDIA的CUDA nvcc编译器在编译过程中将设备代码从主机代码中分离出来。
  • 在链接阶段,在内核程序调用和显示GPU设备操作中添加CUDA运行时库。
标题

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值