首页 > 编程语言 >GPU与CUDA C编程基本知识

GPU与CUDA C编程基本知识

时间:2023-08-21 22:12:55浏览次数:59  
标签:基本知识 线程 CUDA 2.2 memory device GPU 内存

一 、CPU与GPU的异同

CPU:延迟导向内核,所谓延迟,指指令发出到得到结果中间经历的时间。

GPU:吞吐导向内核,所谓吞吐量指单位时间内处理的指令数量。其适合于计算密集或者数据并行的场合。

二、CUDA

2.1 简介

CUDA(Compute Unified Device Architecture)是由英伟达公司2007年开始推出,初衷是为GPU增加一个易用的编程接口,让开发者无需学习复杂的着色语言或者图形处理原语。

2.2 并行计算整体流程

void GPUkernel(float* A, float* B, float* C, int n)
{
	Part1(开辟显存并将host中的数据拷贝到此处). //Allocate device memory for A, B, and C 
       //copy A and B to device memory 
	Part2(执行计算). //Kernel launch code – to have the device
	   //to perform the actual vector addition
	Part3(将运算结果拷贝到host上并释放显存). //copy C from the device memory
	   //Free device vectors
}

cudaComputeProcess

具体编程实现上有三种做法:

//1、 逐个文件编译 --->将与GPU相关的头文件放到.h或者.cuh中,将设备端(GPU上)执行的程序,即被__global__或者__device__修饰的核函数放到.cu文件中,然后使用NVCC编译,然后将主机端的程序放到.h与.cpp/.c中,继续使用gcc或者g++编译,最后分别使用ncvv和g++生成.o文件连接成可执行程序。

//2、使用nvcc将GPU的程序编译成.so,链接的时候只使用.so就可以。

//3、cmake的方式。

针对上述流程,还有如下几点需要说明

2.2.1 术语

Device=GPU
Host=CPU
Kernel=GPU上运行的函数

2.2.2 内存模型

CPU和GPU之间通过内存和显存之间的互相拷贝来进行参数的传递,于是就引出了cuda编程中的内存模型。

硬件侧解释:

  • 每个线程处理器(SP)都用自己的registers(寄存器)
  • 每个SP都有自己的local memory(局部内存),register和local memory只能被线程自己访问
  • 每个多核处理器(SM)内都有自己的shared memory(共享内存),shared memory 可以被线程块内所有线程访问
  • 一个GPU的所有SM共有一块global memory(全局内存),不同线程块的线程都可使用

CPU&GPUMemoryChange

软件侧解释:

  • 线程处理器(SP)对应线程(thread)
  • 多核处理器(SM)对应线程块(thread block)
  • 设备端(device)对应线程块组合体(grid)
  • 一个kernel其实由一个grid来执行
  • 一个kernel一次只能在一个GPU上执行

softVShard

2.2.3 线程块id和线程id的概念

之前提到核函数是要在Device端进行计算和处理, 那么在执行核函数的过程中,需要访问到网格中(grid)每一个线程中的寄存器和独立的内存,继而需确定每一个线程在显存中的位置,从而引出了线程块id(1D、2D、3D)和线程id(1D、2D、3D)的概念。

2.2.4 线程束(wrap)的概念

SM采用的SIMT(Single-Instruction, Multiple-Thread,单指令多线程)架构,warp(线程束)是最基本的执行单元,一个 warp包含32个并行thread,这些thread以不同数据资源执行相同的指令。

其本质是线程在GPU上运行的最小单元,且由于wrap的大小为32,所以block所含的thread的大小一般要设置为32的倍数。

标签:基本知识,线程,CUDA,2.2,memory,device,GPU,内存
From: https://www.cnblogs.com/Terrypython/p/17647220.html

相关文章

  • WSL2 Ubuntu20.04 配置 CUDA
    前言本文主要讲解如何在Widnows11环境下的WSL2(Ubuntu20.04)配置CUDA来启用GPU加速(本文默认您已经在Windows上安装完成NvidiaCUDA)配置流程检查驱动打开GeForceExperience检查驱动程序的情况,需要更新到最新版,最后重启GeForceExperience。安装CUDA命令生成生......
  • 《HTML CSS JavaScript 网页制作》JavaScript基本知识(简介、语法、事件、对象)
    一、JavaScript简介1、JavaScript特点脚本语言:是一种解释型的脚本语言,在程序运行过程中逐行进行解释;基于对象:可以创建对象,也能使用现有的对象;简单:采用的是弱类型的变量类型,对使用的数据类型未作出严格的要求;动态性:采用事件驱动,不需要经过web服务器就可以对用户的输入作出响应;跨平台......
  • 使用 UCS(On-Premises) 管理您的GPU资源池,释放AI大模型算力潜能
    本文分享自华为云社区《使用UCS(On-Premises)管理您的GPU资源池,释放AI大模型算力潜能》,作者:云容器大未来。AI技术现状及发展趋势过去十余年,依托全球数据、算法、算力持续突破,人工智能全面走向应用,已成为社会生产生活的支柱性技术。2020年后,当自动驾驶、人脸识别等热门应用发......
  • cuda11.2升级安装
    1安装指定版本驱动和cuda驱动版本网址:https://developer.nvidia.com/cuda-toolkit-archive下载cuda11.2,以我们服务器为例,进行勾选得到下载命令wgethttps://developer.download.nvidia.com/compute/cuda/11.2.1/local_installers/cuda_11.2.1_460.32.03_linux.runsudo下载完......
  • 电脑的基本知识
    电脑硬件CPU内存主板IO设备软件系统软件DOS(Diskoperatingsystem),Windows,Linux,Unix,Mac,Android,iosWPS,QQ,微信,游戏电脑快捷键复制:Ctrl+C粘贴:Ctrl+V全选:Ctrl+A剪切:Ctrl+X撤销:Ctrl+Z保存:Ctrl+S关闭窗口:Alt+F4永久删除文件(非回收站):Shift+delete快捷打开程......
  • cuda编程(1)
    cuda:#include<stdio.h>#include<stdlib.h>//#include<conio.h>__global__voidwhat_is_my_id(unsignedint*constblock,unsignedint*constthread,unsignedint*constwarp,unsignedint*constcalc_thread){ constun......
  • 爬虫开发网络基本知识
    爬虫开发网络基本知识1.HTTP与HTTPS超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比......
  • [cuda]RMSNorm核函数解析
    计算原理\(RMSNorm=x*(sqrt(1/n*(x_i)^2+eps))*g\)torch实现classRMSNorm(torch.nn.Module):def__init__(self,dim:int,eps:float=1e-6):super().__init__()self.eps=epsself.weight=nn.Parameter(torch.ones(dim))......
  • 强化学习算法如何将GPU利用率提高到100%——在线强化学习如何将GPU利用率提升至100%
    一直有个疑问,那就是“强化学习算法如何将GPU利用率提高到100%”,在一些论坛中也有人会提出这样的问题,但是一直也没有人比较正面的回答过这个问题,为此正好自己又想到了这么一个问题,于是想在这里正面的谈论下这个问题。......
  • C语言基本知识要点:
    目录一.基本数据类型 1.数据类型划分 2.基本数据类型的基本知识(32位系统) (1)整型:short2字节,int4个字节,long4个字节 (2)字符型:char2个字节(一一对应ASCII码) (3)浮点型: 3.进制转换 (1)八进制转二进制 八进制数据的1位对应二进制数据的3位 (2)十六进制转二进制 4.数据在内存中的存储方......