CUDA编程

CUDA编程模型

CUDA简介

2006年,NVIDIA公司发布了CUDA,CUDA是一种通用的并行计算平台和编程模型,是在C语言基础上扩展的。借助于CUDA,可以像编写C语言程序一样实现并行算法。可以在NVIDIA的GPU平台上用CUDA为多种系统编写应用程序,范围从嵌入式设备、平板电脑、笔记本电脑、台式机、工作站到HPC集群。CUDA编程模型提供了一个计算机架构抽象作为应用程序和其可用硬件之间的桥梁。

CUDA编程结构

CUDA编程模型是一个异构模型,需要CPU和GPU协同工作,因此CUDA架构第一次引入主机(Host)端与设备(Device)端的概念。一个完整的CUDA程序由主机代码和设备代码两部分组成。主机代码在CPU上执行,设备代码在GPU上执行。

CUDA程序实现流程

(1)把输入数据从CPU内存复制到GPU显存
(2)在执行芯片上缓存数据,加载GPU程序并执行
(3)将计算结果从GPU显存中复制到CPU内存中

CUDA内存管理

CUDA运行时负责分配与释放设备内存,并且在主机内存和设备显存之间传输数据。

标准的C函数

CUDA C函数

malloc

cudaMalloc

memcpy

cudaMencpy

free

cudaFree

cudaMencpy函数原型为:

cudaMencpy(void *dst, const void *src, size_t count, cudaMencpyKind kind)

从src指向的源存储区复制count数量的字节到dst指向的目标存储区;复制方向由kind制定。其中kind有以下几种:

cudaMencpyHostToHost
cudaMencpyHostToDevice
cudaMencpyDeviceToHost
cudaMencpyDeviceToDevice

CUDA程序结构

go语言重构python go语言cuda_ubuntu

CUDA程序主要由两部分组成,一部分是主函数,另一部分是设备函数。

函数

执行位置

调用位置

_device_

device

device

_global_

device

host&device(arch>3.0)

_host_

host

host

_global_定义一个kernel函数,一般在CPU上调用,GPU上执行,函数类型必须为void。

编写CUDA程序

编写CUDA程序的步骤

(1)创建一个以.cu为后缀名的文件
(2)编写CUDA程序
(3)编译.cu文件生成可执行文件

编译并执行

用nvcc编译器编译.cu文件

nvcc xx.cu -o xx

(-o后的xx为编译后的可执行文件)
在当前文件夹下输入 ./xx 即可运行该可执行文件