目录
最后让我们用一个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被称为设备端。
所以一个CUDA程序分为主机端和设备端。我们这里是用C语言来进行学习的,所以主机端是C语言会使用C的编译器来编译;而设备端使用CUDA C编写的,其是通过nvcc进行编译的。
最后让我们用一个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 就会得到以下结果