cuda编程系列-架构简介(一)

1、cuda介绍
cuda(Compuite unified Device Architecture)是由英伟达开发的进行并行计算的平台和编程模型。支持英伟达显卡进行加速。其他类型的显卡进行加速可以使用Opencl,它比cuda更复杂。
cuda编程需要C++/C基础,使用c和C++借助cuda提供的API进行应用程序开发,加速程序运行。(opencv里面提供了cuda加速模块,需要重新编译opencv)
2、并行处理
看到一个例子介绍并行处理分享给大家,很容易理解。
假如需要在很短时间内挖一个很大的洞,会有哪些方法来实现?

  • 可以用一个普通的工具,加快挖掘速度。
  • 可以买一个更好用的铲子。(磨刀不误砍柴功)
  • 可以找更多的挖掘机,来进行挖掘

从这个例子里面类比并行模式,第一种方案类似于使用更快的时钟,第二种方案类似每个时钟周期做更多工作的晶体管,第三种方案类似拥有许多可以并行执行任务的处理器。cuda遵循第三种方案,它不是一个可以执行复杂任务的更强大的处理器,而是有许多小而简单的且可以并行工作的处理器。
3、gpu架构
GeForce256是英伟达于1999年开发的第一个GPU。最初只用于在显示器上渲染高端图形。它们只用于像素计算。后来,人们意识到如果可以做像素计算,那么他们也可以做其他的数学计算。现在gpu除了用于渲染图形图像外,还可用于其他许多应用程序中。这些gpu被称为通用gpu(Gpgpu)。
你可能会想到的下一个问题是CPU和GPU的硬件架构有什么不同,从而可以使得GPU能够进行并行计算?CPU具有复杂的控制硬件和较少的数据计算硬件。复杂的控制硬件在性能上提供了CPU的灵活性和一个简单的编程接口,但是就功耗而言,这是昂贵的。而另一方面,GPU具有简单的控制硬件和更多的数据计算硬件,使其具有并行计算的能力。这种结构使它更节能。缺点是它有一个更严格的编程模型。在GPU计算的早期, Opengl和 Directx等图形API是与GPU交互的唯一方式。对于不熟悉 OPENGL或 Directx的普通程序员来说,这是一项复杂的任务。这促成了CUDA编程架构的开发,它提供了一种与GPU交互的简单而高效的方式。关于CUDA架构的更多细节将在下一节中给出。
一般来说,任何硬件架构的性能都是根据延迟吞吐量来度量的。延迟是完成给定任务所花费的时间,而吞吐量是在给定时间内完成任务的数量。这些概念并不矛盾。通常情况下,提高一个,另一个也会随之提高。在某种程度上,大多数硬件架构旨在提高延迟或吞吐量。例如,假设你在邮局排队。你的目标是在很短的时间内完成你的工作,所以你想要改进延迟,而坐在邮局窗口的员工想要在一天内看到越来越多的顾客。因此,员工的目标是提高吞吐量。在这种情况下,改进一个将导致另一个的改进,但是双方看待这个改进的方式是不同的。
同样,正常的串行CPU被设计为优化延迟,而GPU被设计为优化吞吐量。CPU被设计为在最短时间内执行所有指令,而GPU被设计为在给定时间内执行更多指令。GPU的这种设计理念使它们在图像处理和计算机视觉应用中非常有用,这也是本书的目的,因为我们不介意单个像素处理的延迟。我们想要的是在给定的时间内处理更多的像素,这可以在GPU上完成。
综上所述,如果我们想在相同的时钟速度和功率要求下提高计算性能,那么并行计算就是我们所需要的。GPU通过让许多简单的计算单元并行工作来提供这种能力。现在,为了与GPU交互,并利用其并行计算能力,我们需要一个由CUDA提供的简单的并行编程架构。
4、cuda架构
CUDA架构包括几个专门为GPU通用计算而设计的特性,这在早期的架构中是不存在的。它包括一个 unified shedder管道,它允许GPU芯片上的所有算术逻辑单元(ALU)被个CUDA程序编组。ALU还被设计成符合IEE浮点单精度和双精度标准,因此它可以用于通用应用程序。指令集也适合于一般用途的计算,而不是特定于像素计算。它还允许对内存的任意读写访问。这些特性使 CUDA GPU架构在通用应用程序中非常有用。
所有的GPU都有许多被称为核心(Core)的并行处理单元,在硬件方面,这些核心被分为流处理器和流多处理器。cuda程序作为一系列列并行运行的多线程执行。每个线程都在不同的核心上执行。可以将GPU看作多个块的组合,每个块可以执行多个线程。每个块绑定到GPU上不同流多处理器。
如何理解代码程序在CPU上执行或者GPU执行,假如已知有一台CPU和GPU组成的计算平台,我们将CPU及其内存成为主机(Host),GPU及其内存称为设备(Device).cuda代码包含主机和设备的代码。主机代码由普通C或C++编译器在CPU上编译,设备代码由GPU编译器在GPU上编译。主机代码通过内核调用调用设备代码。它将在设备上并行启动多个线程具体流程如下:

  • 为主机和设备显存中的数据分配内存。
  • 将数据从主机内存复制到设备内存
  • 指定并行度来启动内核
  • 所有线程完成后,将数据从设备现存复制回主机内存
  • 释放主机和设备使用的所有内存

5、cuda应用的领域

  • 计算机视觉应用
  • 医学成像
  • 金融计算
  • 电子设计自动化

6、cuda开发环境

  • 支持CUDA的GPU
  • 英伟达显卡驱动
  • 标准的C编辑器
  • CUDA开发工具包

7、创建cuda程序的步骤

  • 安装对应版本的vs
  • 新建工程->新建文件->Nvidia->cuda9.0->cuda9.0 runtime
  • 自定义名称,确认
  • 将自动创建带kernel.cu示例文件,删除现有代码,编写代码
  • 编译运行

8、测试程序

#include<iostream>
__global__ void hellcuda(void){}
int main()
{
    hellocuda<<<1,1>>>();
    cout<<"hello cuda!"<<endl;
    return 0;
}

9、程序解读

  • global cuda C在标准C中的添加的一个限定符,指定程序在gpu上运行
  • <<<1,1>>> 表示将cpu参数传到gpu上,表示块的数量和gpu上并行运行的线程数,具体含义表示hellocuda()运行在gpu上的一个块和一个线程上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值