ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CUDA 第一课:

CUDA 第一课: CUDA 第一课在C语言中 文本编辑器 —— 预处理 —— hello.i —— 编译 —— hello.s —— 汇编 —— hello.o —— 链接 —— hello预处理解决 # C语言的库。 拼接成完整C代码。还是C代码只是告诉编译器 那些库函数是怎么用C写好的就是给编译器看这些函数的原始定义但是没有这些函数的机器代码。编译 compile 把 C 代码翻译为 汇编代码。汇编 把汇编指令变成机器吗。 但是是不同的C文件各自自己变成机器码hello.c ↓ gcc-E hello.i 这里能看到 stdio.h 展开后的 printf 声明 ↓ gcc-S hello.s 这里能看到 call printf ↓ gcc-c hello.o nm 可以看到 U printf T当前.o 里已经定义了 UUndefined当前.o 里没定义 ↓ gcc hello.o-o hello 链接器去 C 标准库找 printf 的实现 ↓ hello.exe 或者 其他环境下的可执行文件。CUDA 中的 Hello World 程序CUDA程序的编译器驱动 nvcc 支持编译纯粹的 C 代码。 一个标准的 CUDA 程序其既有纯粹C 代码又有 不属于C的真正 CUDA 代码。 CUDA程序的编译器驱动 nvcc 去编译 CUDA会将纯C的代码交给C编译器其自己则负责编译剩下的部分。CUDA程序 源文件为 .cu。GPU只是主机的一个设备所以使用GPU的话一个程序既要有主机代码又要有设备代码。主机对设备的调用是通过核函数来实现的。Host 主机端也就是运行普通程序的 CPU 主存这一侧。Device 设备端也就是 GPU 操作系统 系统内存等等这一侧。Host主机端CPU系统内存 RAM普通 C/C 代码││ 启动 kernel▼Device设备端GPU显存 VRAMCUDA kernel什么是核函数 Kernel FunctionKernel 可以理解成CPU 发给 GPU 执行的一段并行计算任务。Host 端负责发起 kernel launchGPU 端真正执行 kernel。intmain(void){主机代码 核函数的调用 主机代码return0;}CUDA中 核函数 与 C 中 函数类似但其必须被限定词__global__修饰。核函数返回类型必须是空类型即 void一般情况下普通的函数其实相当于__host__限定符是 NVIDIA 在设计 CUDA编程模型的时候引入的语言扩展。 并不属于 C/C 的关键字。限定符谁调用在哪执行__host__CPUCPU__device__GPUGPU__global__CPUGPU__global__voidhello_from_gpu(){printf(Hello World from the GPU! \n);}限定符 __global__和 void 的次序可以随意void__global__hello_from_gpu(){printf(Hello World from the GPU! \n);}核函数必须经过调用才可以被发挥作用。#includestdio.h__global__voidhello_from_gpu()printf(Hello World from the GPU!\n);intmain(void)hello_from_gpu1,1();cudaDeviceSynchronize();return0; 这三对括号调用核函数时需要这对三括号里面的信息一块GPU有很多 计算核心。如 Tesla V100 有 5120个计算核心。 其可以支持多线程。主机在调用一个核函数的时候必须指明需要在设备中指派多少个线程否则设备不知道如何工作。 用于指明 核函数 中的 线程数目 及 排列情况。核函数中的线程通常会组织为若干线程块
返回列表