MindSpore:CUDA编程(二)CUDA代码执行原理
我们把 CPU,内存这块区域叫做“主机(HOST)”,把GPU,显存这块区域叫做“设备(DEVICE)”。(是不是跟昇腾有点类似?)CUDA的代码执行包含以下几步:
文章图片
文章图片
文章图片
简述一下,就是 host_to_device-》在device上并行计算-》device_to_host。cuda程序其实是一个对C的扩展程序。其后缀名为.cu,如果头文件则为.cuh。这个.cu 程序除了C程序的语法外,还有一些cuda的特有部分,比如它在函数前面加了前缀,分为 global__, __host__,__device 三种。对于__global__:
文章图片
所谓的“执行配置”,下面会提到,比如说是 <<< >>>中间的内容。这个标识符将一个C函数声明成一个 核函数。它只能在设备(device)上执行。对于__host__:
文章图片
对于__device_:
文章图片
这几个前缀定义了这些代码运行的设备,这会让程序决定在哪个设备上运行。对于一个简单的Hello World代码而言:#include
void hello_from_cpu()
{
printf("Hello World from the CPU!\n");
}
int main(void)
{
hello_from_cpu();
return 0;
如果我们想让它在GPU上运行,仅需要做两步:(1)将被调用的函数 hello_from_cpu 改为 hello_from_gpu ,前面加上 global 将其定义为核函数。(2)在main主函数调用的时候,加上执行配置<<< >>>部分,如加上<<<1,1>>>则为并行1次,如加上<<<2,4>>>则运行 2X4次。我们看看实际代码修改后的效果:#include
global void hello_from_gpu()
{
printf("Hello World from the GPU!\n");
【MindSpore:CUDA编程(二)CUDA代码执行原理】}
int main(void)
{
hello_from_gpu<<<1,1>>>();
return 0;
}
cu代码必须使用nvcc编译,编译的时候要根据GPU架构的不同填不同的参数。
文章图片
其中,arch参数如下:
文章图片
code参数如下:
文章图片
举个简单的例子,张小白这台笔记本的显卡是Quardo P1000,是Pascal架构,那么参数是compute_61和sm_61.我们执行以下语句:/usr/local/cuda/bin/nvcc -arch=compute_61 -code=sm_61 hello_cuda.cu -o hello_cuda./hello_cuda
文章图片
如果将执行配置改为2,4:
文章图片
可以发现这个核函数被执行了8次。
推荐阅读
- MindSpore易点通·精讲系列--网络构建之LSTM算子--上篇
- MindSpore(CUDA编程(四)Global Memory)
- MindSpore:CUDA编程(三)线程层次
- MindSpore(CUDA编程(六)存储单元)
- MindSpore:CUDA编程(五)Event
- 编程语言|2021年2月程序员工资最新出炉,涨了!这下踏实了!
- 人工智能|人工智能、机器人、编程啥关系((科普))
- 计算机专业技术|大数据编程技术——期末复习
- 30秒接入一台PLC设备,用Shifu 快速实现工控软件编程
- 编程语言|2020 ,6 种不死的编程语言!