目录

在了解什么是cuda之前,需要先知道什么是gpu;

OK,那么GPU有哪些特性呢?

OK,那么什么是CUDA呢?

那这里为什是异构计算呢?

最后让我们用一个CUDA C的hello world来结束这篇blog。


在了解什么是cuda之前,需要先知道什么是gpu;

 GPU这个概念是由Nvidia公司于1999年提出的。GPU是显卡上的一块芯片,就像CPU是主板上的一块芯片。那么1999年之前显卡上就没有GPU吗?当然有,只不过那时候没有人给它命名,也没有引起人们足够的重视,发展比较慢。

GPU(Graphic Processing Unit),图形处理单元;起初它只是用来做图像计算的,但是后来随着深度学习的火热发展,人们就惊喜的发现,GPU可以用来处理深度学习网络中的各种并行计算。

于是在这个切机下Nvidia公司又提出了CUDA的概念。

OK,那么GPU有哪些特性呢?

直接说一个重点区分,GPU和CPU最大的区分就是CPU是多核而GPU是众核;且cpu的核比较重,适合处理比较复杂的逻辑,以优化串行程序执行;而GPU的核比较轻,用于优化具有简单控制逻辑的数据并行任务,注重并行程序的吞吐量。

所以GPU一般使用CUDA核心数量和内存大小来标识其性能,对于的指标为峰值计算能力和内存带宽;而NVIDIA使用了计算能力来描述GPU的性能,具体可以参考:处理器和GPU的计算能力如何计算? - 知乎

OK,那么什么是CUDA呢?

首先CUDA是一个平台,一个包含了并行计算架构和编程模型的异构计算平台。并行计算架构就是gpu,而编程模型是CUDA加速库、编译指令、接口、以及对各种行业标准语言的支持(包括 c、c++、python)。

那这里为什是异构计算呢?

这是因为GPU不是一个独立运行的平台,而是一个CPU协处理器;因此GPU必须通过PCLe总线和CPU相链接。在异构计算平台组CPU被称为主机端、GPU被称为设备端。

GPU并行计算实战 gpu的并行计算_异构计算

所以一个CUDA程序分为主机端和设备端。我们这里是用C语言来进行学习的,所以主机端是C语言会使用C的编译器来编译;而设备端使用CUDA C编写的,其是通过nvcc进行编译的。

GPU并行计算实战 gpu的并行计算_GPU并行计算实战_02

最后让我们用一个CUDA C的hello world来结束这篇blog。

当然,前提是你拥有一个CUDA环境~

 hello_world.cu 代码有注释解释哦

#include <stdio.h>

/*
一个典型的CUDA编程结构包括5个主要步骤
1:分配GPU内存。
2:从CPU内存中拷贝数据到GPU内存。
3:调用CUDA内核函数来完成程序指定的运算。
4:将数据从GPU拷贝CPU内存
5:释放GPU内存空间
*/

// __global__ 修饰符告诉编译器这个函数会从cpu调用,GPU执行
__global__ void helloWorldFormGpu(void) {
    printf("hello world form GPU\n");
}

int main(){
    printf("hello world form CPU\n");

    // 三重尖括号有10个线程来执行这个函数
    helloWorldFormGpu <<<1, 10>>>();
    // 清空当前设备的资源
    cudaDeviceReset();
    return 0;
}

然后

nvcc hello_world.cu -o hello

./hello 就会得到以下结果

GPU并行计算实战 gpu的并行计算_cuda_03