CUDA是英伟达推出的并行计算架构,全称为Compute Unified Device Architecture。其实就是CPU加上GPU。

CUDA入门之并行与核函数

那GPU是什么呢?GPU一开始是用来做图像处理的,所以又称为图像处理器,算是一种微处理器。我们的电脑上不一定带有GPU哦,好点的电脑才有。

我们现在的电脑手机上面都有CPU,我们可以边聊微信边看电影边吃鸡,感觉这些事件似乎在同时发生一样。其实是CPU欺骗了我们,CPU切换的太快了,我们感觉不到。因此觉得这些程序这些进程貌似同时在跑在运行一样,也就是程序在并行执行一样,其实不是的,一般都是等上一个时间片跑完了然后再切换(这个要看真正的实际的物理核),但是CPU上面常常跑几十上百个线程,一般系统肯定是没有这么多的物理线程的,都是逻辑线程,所以并不是真正意义上的并行。

说到并行,那什么是并行呢?其实就是字面意思,就是两个或者两个以上的人并排走路。

    

CUDA入门之并行与核函数

从软件程序上来说,举个例子,你要吃饺子,没有大蒜和酱油,于是你分别叫小明去打酱油叫小红去买大蒜。有两种方案:一种是同时去买,两人同时去买大蒜和酱油,也就是并行;另外一种是小红等小明去买完了酱油回来之后再去买大蒜,也就是串行。很显然串行的时间很慢,等把大蒜买回来,估计饺子都冷了。

显而易见,并行的好处是大大的。而CUDA本身就具有物理上的并行优势,GPU本身在物理上就有很多硬件线程,在处理单指令多数据的运算上占有相当大的优势,在高性能计算中得到越来越多的广泛应用。

那我们来看一下怎样进行CUDA编程。

  • 检查机子是否有硬件GPU    lspci | grep -i nvidia

  • 检查机子上面是否安装CUDA环境。用这个命令 lspci | grep -i nvidia 或者是 which nvcc都可以查看。

以下是我在虚拟机中检查的,表示没有安装

CUDA入门之并行与核函数

以下是我在有GPU并且装了CUDA环境的服务器上的查看

CUDA入门之并行与核函数

  • 开始编写CUDA程序,其实cuda程序和我们平时的C或者是C++程序的写法是差不多的。

注意,我们建立的源文件是后缀名为.cu的文件,比方我们这里建立的cudatest.cu。

touch cudatest.cu

编写里面的代码如下:

#include <stdio.h>

__global__ void helloFromGPU (void)

{

printf("Hello World from GPU!\n ");

}

int main(void)

{

// hello from cpu

printf("Hello World from CPU!\n");

helloFromGPU <<<1, 10>>>();

cudaDeviceReset();

return 0;

}

  • 然后再终端编译程序

nvcc -arch sm_60 cudatest.cu -o cudatest

  • 运行编译生成的可执行文件 cudatest

CUDA入门之并行与核函数

    发现只有第一行是输出CPU,其他的10行都是输出GPU。这是为什么呢?是因为下面这个函数

CUDA入门之并行与核函数

    这个函数称之为核函数,核函数就是运行在设备上(gpu上)的函数,cuda是有CPU和GPU组成的,我们把CPU部门成为主机(host)部分,把GPU部门成为设备(device)部分。我们看到helloFromGPU 这个函数前面有一个修饰符__global__ ,带有__global__ 修饰符的就是跑在GPU上的函数,叫核函数。

__global__ 修饰符会告诉编译器这个函数将会从CPU调用,然后在GPU上面执行。怎么调用呢?就是三重尖括号,三重尖括号里面的参数是执行配置,用来说明我需要调用多少个GPU线程,比方我们这里就是1*10调用10个线程,所以我们看到有10GPU的打印,每个线程都打印了一次,并且是同时运行,是并行的。

CUDA入门之并行与核函数

还有一点是核函数的返回值类型是void。

所以的核函数都具有以下限制:

(1)只能访问设备内存

(2)返回值类型为void

(3)不支持可变数量的参数

(4)不支持静态变量

(5)显示异步行为

 

推荐图书:

Professional CUDA C Programming.pdf

 

//更多内容请关注微信公众号码农派生

CUDA入门之并行与核函数

相关文章: