乐趣区

关于机器学习:MindSporeCUDA编程二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 <stdio.h>

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 <stdio.h>

global void hello_from_gpu()
{

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

}

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 次。

退出移动版