CUDA C编程权威指南 第一章

断了今生、忘了曾经 提交于 2020-01-21 05:05:46

基础

  1. CUDA(Compute Unified Device Architecture)是NVIDIA提出

  2. CPU和GPU是的PCI-Express总线相连

  3. cpu
    CPU则负责管理设备端的资源;
    CPU核心比较重,用来处理非常复杂的控制逻辑,以优化串行程序执行。
    CPU线程:操作系统必须交替线程使用启用或关闭CPU执行通道以提供多线程处理功能。上下文的切换缓慢且开销大

  4. gpu
    GPU用来提高计算密集型应用程序中并行程序段的执行速度,
    GPU代表了一种众核架构(many cores),包含多线程、MIMD(多指令多数据)、SIMD(单指令多数据),以及指令级并行。英伟达称:SIMT(单指令多线程)
    GPU核心较轻,用于优化具有简单控制逻辑的数据并行任务,注重并行程序的吞吐量。
    GPU线程,GPU上的线程是高度轻量级的。

  5. GPU性能
    GPU容量特征:1. CUDA核心数 2. 内存大小

GPU性能评估:
1. 峰值计算性能,用GFlops(每秒十亿次浮点运算),TFlops(每秒万亿次浮点运算)
2. 内存带宽读取或写入数据的比率,GB/s

带宽是单位时间内可处理的数据量,通常表示为MB/s或GB/s。
吞吐量是单位时间内成功处理的运算数量,通常表示为gflops(即每秒十亿次的浮点运算数量)

  1. 异构架构
    异构应用包含:主机代码和设备代码
    GPU不是一个独立运行的平台而是CPU的协处理器。GPU必须通过PCIe总线与基于CPU的主机相连来进行操作,么CPU所在的位置被称作主机端而GPU,所在的位置被称作设备端。
    CPU计算适合处理控制密集型任务,GPU计算适合处理包含数据并行的计算密集型任务。

在这里插入图片描述

  1. 代码:
    在CPU上运行的主机代码
    在GPU上运行的设备代码
    NVIDIA的CUDA nvcc编译器在编译过程中将设备代码从主机代码中分离出来

例子:

检查nvcc编译器是否安装
which nvcc # /usr/local/cuda/bin/nvcc
检查GPU加速卡
ls -l /dev/nv*

CUDA C程序步骤

  1. 扩展名 .cu
  2. CUDA nvcc 编译器来编译程序
__global__ void helloFromGPU()//__global__指明该函数在GPU上执行
{
    printf("Hello World from GPU!\n");
}

int main(int argc, char **argv)
{
    printf("Hello World from CPU!\n");
    helloFromGPU<<<1, 10>>>();//GPU函数调用,<<>>中是线程的个数,这里是10个
    cudaDeviceReset();//释放GPU资源,清空缓冲区, 不然不会打印
    return 0;
}

cuda程序执行5个步骤

  1. 分配GPU内存
  2. 从CPU拷贝数据到GPU
  3. 调用CUDA内核来完成程序的指定运算
  4. 数据从GPU拷贝回CPU内存
  5. 释放GPU内存空间

其他

·分布式内存的多节点系统:
每个处理器有自己的本地内存,而且处理器之间可以通过网络进行通信这种系统常被称作集群.

·共享内存的多处理器系统
多处理器和同一个物理内存相关联或共用一个低延迟的链路(如PCI-Express或PCIe)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!