CUDA 学习(4)——CUDA 编程模型

CPU 和 GPU 由于结构的不同,具有不同的特点:

  • CPU:擅长流程控制和逻辑处理,不规则数据结构,不可预测存储结构,单线程程序,分支密集型算法
  • GPU:擅长数据并行计算,规则数据结构,可预测存储模式

在现在的计算机体系架构中,要完成 CUDA 并行计算,单靠 GPU 一人之力是不能完成计算任务的,必须借助 CPU 来协同配合完成一次高性能的并行计算任务。

一般而言,并行部分在 GPU 上运行,串行部分在 CPU 运行,这就是异构计算

异构计算的意思就是不同体系结构的处理器相互协作完成计算任务。CPU 负责总体的程序流程,GPU 负责具体的计算任务,当 GPU 各个线程完成计算任务后,将 GPU 那边计算得到的结果拷贝到 CPU 端,完成一次计算任务。

Definitions:

  • Device --> GPU
  • Host --> CPU
  • Kernel --> function that runs on the devcie

1 CUDA 线程模型

线程是程序执行的基本单元,CUDA 的并行计算是通过成千上万个线程的并行执行来实现的。

CUDA的线程模型从小往大:

  • Thread:线程,并行的基本单位
  • Thread Block:线程块,互相合作的线程组,线程块有如下几个特点:
    • 允许彼此同步
    • 可以通过共享内存快速交换数据
    • 以 1 维、2 维或 3 维组织
  • Grid:一组线程块
    • 以 1 维、2 维组织
    • 共享全局内存
  • Kernel:在 GPU 上执行的核心程序,这个 kernel 函数是运行在某个 Grid 上的。

每一个 block 和每个 thread 都有自己的 ID,通过相应的索引找到相应的线程和线程块。

  • threadIdx,blockIdx
  • Block ID: 1D or 2D
  • Thread ID: 1D, 2D or 3D

GPU 上很多并行化的轻量级线程。kernel 在 device 上执行时实际上是启动很多线程,一个 kernel 所启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间。

grid 是线程结构的第一层次,而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。

grid 和 block 都是定义为 dim3 类型的变量,dim3 可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,缺省值初始化为 1。因此 grid 和 block 可以灵活地定义为 1-dim,2-dim 以及 3-dim 结构,kernel 调用时也必须通过执行配置<<<grid, block>>>来指定 kernel 所使用的网格维度和线程块维度。CUDA的这种<<<grid,block>>>其实就是一个多级索引的方法,第一级索引是(grid.xIdx, grid.yIdy),二级索引(block.xIdx, block.yIdx, block.zIdx),可以用来定位到指定的线程。这就是 CUDA 的线程组织结构。

SP 和 SM 的联系与区别:

  • SP:最基本的处理单元,streaming processor,也称为CUDA core。最后具体的指令和任务都是在 SP 上处理。GPU进行并行计算,也就是很多个 SP 同时做处理。
  • SM:多个 SP 加上其他的一些资源组成一个 streaming multiprocessor。也叫 GPU 大核,其他资源如:warp scheduler,register,shared memory 等。register 和 shared memory 是 SM 的稀缺资源,CUDA 将这些资源分配给所有驻留在 SM 中的 threads。因此,这些有限的资源就使每个 SM 中 active warps 有非常严格的限制,也就限制了并行能力。

每个 SM 包含的 SP 数量依据 GPU 架构而不同,Fermi架构 GF100 是 32 个,GF10X 是 48 个,Kepler 架构都是 192 个,Maxwell 都是 128 个。

简而言之,SP 是线程执行的硬件单位,SM 中包含多个 SP,一个 GPU 可以有多个 SM(比如16个),最终一个 GPU 可能包含有上千个 SP。软件逻辑上所有 SP 是并行的,但是物理上并不是所有 SP 都能同时执行计算(比如我们只有 8 个 SM 却有 1024 个线程块需要调度处理),因为有些会处于挂起,就绪等其他状态。

从硬件角度和软件角度理解 CUDA 的线程模型:

在这里插入图片描述

  • 每个线程由每个线程处理器(SP)执行
  • 线程块由多核处理器(SM)执行
  • 一个 kernel 其实由一个 grid 来执行,一个 kernel 一次只能在一个 GPU 上执行

block 是软件概念,一个 block 只会由一个 sm 调度,程序员在开发时,通过设定 block 的属性,告诉 GPU 硬件,我有多少个线程,线程怎么组织。而具体怎么调度由 sm 的 warps scheduler 负责,block 一旦被分配好 SM,该 block 就会一直驻留在该 SM 中,直到执行结束。一个 SM 可以同时拥有多个 blocks,但需要序列执行。

2 CUDA 内存模型

CUDA 中的内存分为以下几个层次:

  • 每个线程都用自己的 registers(寄存器)
  • 每个线程都有自己的 local memory(局部内存)
  • 每个线程块内都有自己的 shared memory(共享内存),所有线程块内的所有线程共享这段内存资源
  • 每个 grid 都有自己的 global memory(全局内存),不同线程块的线程都可使用
  • 每个 grid 都有自己的 constant memory(常量内存)和 texture memory(纹理内存),不同线程块的线程都可使用

线程访问这几类存储器的速度: register > local memory >shared memory > global memory

3 CUDA 编程模型

3.1 指定代码在哪里跑

通过关键字可以表示某个程序在 CPU 上跑还是在 GPU 上跑。比如用__global__定义一个 kernel 函数,就是 CPU 上调用,GPU 上执行,注意__global__函数的返回值必须设置为void

excuted ononly called from
device float DeviceFunc()devicedevice
global void KernelFunc()devicehost
host HostFunc()hosthost
3.2 CPU 和 GPU 间的数据传输

在 GPU 内存分配回收内存的函数接口:

  • cudaMalloc(): 在设备端分配 global memory
  • cudaFree(): 释放存储空间

CPU 的数据和 GPU 端数据做数据传输的函数接口是一样的,他们通过传递的函数实参(枚举类型)来表示传输方向:

cudaMemcpy(void dst, void src, size_t nbytes,
enum cudaMemcpyKind direction)

enum cudaMemcpyKind:

  • cudaMemcpyHostToDevice(CPU 到 GPU)
  • cudaMemcpyDeviceToHost(GPU 到 CPU)
  • cudaMemcpyDeviceToDevice(GPU 到 GPU)
3.3 用代码表示线程组织模型

可以用dim3类来表示网格和线程块的组织方式,网格 grid 可以表示为一维和二维格式,线程块 block 可以表示为一维、二维和三维的数据格式。( Dim3类型: cuda 的内置类型在定义类型为 dim3 的变量时,未指定的任何组件都将初始化为 1。)

dim3 DimGrid(100, 50);  //5000个线程块,维度是100*50
dim3 DimBlock(4, 8, 8);  //每个线层块内包含256个线程,线程块内的维度是4*8*8
3.4 计算线程编号
  • 使用 N 个线程块,每一个线程块只有一个线程
dim3 dimGrid(N);
dim3 dimBlock(1);

此时计算线程编号:

threadID = blockIdx.x;

其中threadId的取值范围为 0 到 N-1。对于这种情况,可以将其看作是一个列向量,列向量中的每一行对应一个线程块。列向量中每一行只有1个元素,对应一个线程。

  • 使用 M×N 个线程块,每个线程块 1 个线程

线程块是2维的,故可以看做是一个M*N的2维矩阵,其线程号有两个维度,即:

dim3 dimGrid(M, N);
dim3 dimBlock(1);

这里,blockIdx.x 取值 0 到 M-1, blcokIdx.y 取值 0 到 N-1。

这种情况一般用于处理 2 维数据结构,比如 2 维图像。每一个像素用一个线程来处理,此时需要线程号来映射图像像素的对应位置,

pos = blockIdx.y * blcokDim.x + blockIdx.x; //其中gridDim.x等于M
  • 使用一个线程块,该线程具有 N 个线程
dim3 dimGrid(1);
dim3 dimBlock(N);

此时线程号的计算方式为:

threadID = threadIdx.x;

其中 threadId 的范围是 0 到 N-1,对于这种情况,可以看做是一个行向量,行向量中的每一个元素的每一个元素对应着一个线程。

  • 使用 M 个线程块,每个线程块内含有 N 个线程
dim3 dimGrid(M);
dim3 dimBlock(N);

这种情况,可以把它想象成二维矩阵,矩阵的行与线程块对应,矩阵的列与线程编号对应,那线程号的计算方式为:

threadId = threadIdx.x + blcokIdx * blockDim.x;

这里就是把二维的索引空间转换为一维索引空间的过程。

  • 使用 M×N 的二维线程块,每一个线程块具有 P×Q 个线程
dim3 dimGrid(M, N);
dim3 dimBlock(P, Q);

其索引有两个维度:

threadId.x = blockIdx.x * blockDim.x + threadIdx.x;
threadId.y = blockIdx.y * blockDim.y + threadIdx.y;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38601.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端会话控制技术:cookie/session/token

目录 前端中的 Cookie、Session 和 Token&#xff1a;详解与应用1. Cookie1.1 什么是 Cookie&#xff1f;1.2 Cookie 的工作原理1.3 Cookie 的特点1.4 Cookie 的用途1.5 Cookie 的安全性 2. Session2.1 什么是 Session&#xff1f;2.2 Session 的工作原理2.3 Session 的特点2.4…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗&#xff0c;最短行走路线&#xff0c;最短行走时间等)&#xff0c;在其工作空间中找到一…

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能&#xff0c;商家可以在结账流程的定义点安装&#xff0c;包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid&#xff0c;并将于2025年8月28日彻底停用checkout.liquid…

电阻的阻值识别

电阻买回来是有偏差的&#xff0c;不同的电阻种类&#xff0c;它的偏差大小会不一样&#xff0c;偏差越小的肯定越贵 主要看要求的精度要求是否越高 色环电阻或者说插件电阻 用来读数的几个色环它是比较靠近的&#xff0c;精度的色环跟用来读数的几个色环的间距会大一点点。 间…

quartz.net条件执行

quartz.net条件执行 在使用Quartz.NET时&#xff0c;你可能需要基于某些条件来决定是否执行一个任务。Quartz.NET本身并不直接支持基于条件执行任务的功能&#xff0c;但你可以通过一些策略来实现这一需求。下面是一些方法来实现基于条件的任务执行&#xff1a; 1. 使用触发器…

计算机操作系统(四) 操作系统的结构与系统调用

计算机操作系统&#xff08;四&#xff09; 操作系统的结构与系统调用 前言一、操作系统的结构1.1 简单结构1.2 模块化结构1.3 分层化结构1.4 微内核结构1.5 外核结构 二、系统调用1.1 系统调用的基本概念1.2 系统调用的类型 总结&#xff08;核心概念速记&#xff09;&#xf…

NSSCTF(MISC)——[SUCTF 2018 招新赛]single-dog

相应的做题地址&#xff1a;https://www.nssctf.cn/problem/2324 分离图片 在1.txt中得到一段颜文字 http://www.hiencode.com/aaencode.html 解密得到flag

低功耗蓝牙(BLE)方案设计实战指南

一、BLE方案设计工具链 1. 硬件选型与开发平台 TI平台&#xff1a;CC2540/CC2541芯片&#xff0c;使用SmartRF Flash Programmer烧录Nordic平台&#xff1a;nRF51822芯片&#xff0c;使用nRFgo Studio管理协议栈常用调试工具&#xff1a;TI CC Debugger、J-Link&#xff08;SW…

网络基础(一)

独立模式与网络互联 独立模式: 计算机之间相互独立。 网络互联&#xff1a;多台计算机连接在一起&#xff0c;完成数据共享。 注意&#xff1a;无论是主机内还是主机外&#xff0c;都是通过线来进行连接的&#xff0c;主机内线&#xff08;线比较短&#xff09;的连接主要考虑…

用Canvas 画布样式实现旋转的阴阳图

用Canvas 画布样式实现旋转的阴阳图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Canvas八卦图动画</title><style>/* 重置所有元素的默认样式 */* {padding: 0;margin: 0;box-sizin…

第16届蓝桥杯单片机4T模拟赛三

本次模拟赛涉及的模块&#xff1a;基础三件套&#xff08;Led&Relay&#xff0c;按键、数码管&#xff09; 进阶单件套&#xff08;pcf8591的AD模块&#xff09; 附件&#xff1a; 各模块底层代码在文章的结尾 一、数码管部分 1.页面1 页面1要显示的格式是&#xff1a; …

优选算法的睿智之林:前缀和专题(一)

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…

瑞萨RX23E系列开发(二)建立工程

新建工程 使用倒数第二个模板 选择路径 我这里是这个型号。根据型号选择芯片 第一次需要下载FIT

【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

括号生成 https://leetcode.cn/problems/generate-parentheses/description/ 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 左括号数必须大于右括号数&#xff0c;且小于等于n class Solution { publ…

Apache Doris学习

https://doris.apache.org/zh-CN/docs/gettingStarted/what-is-apache-doris 介绍 Apache Doris 是一款基于 MPP 架构&#xff08;大规模并行处理&#xff09;的高性能、实时分析型数据库。它以高效、简单和统一的特性著称&#xff0c;能够在亚秒级的时间内返回海量数据的查询…

基于springboot的新闻推荐系统(045)

摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算机管理新闻推荐系统的方案。文章介绍了…

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面&#xff0c;说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行&#xff0c;接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…

(二)VMware:VMware虚拟机安装CentOS教程

目录 1、准备CentOS 7镜像1.1、官网镜像下载1.2、清华大学开源镜像下载​1.3、阿里云开源镜像下载 2、使用 VMware安装CentOS 72.1、创建虚拟机2.2、选择自定义安装2.3、硬件兼容性&#xff0c;保持默认2.4、选择下载的ISO镜像2.5、设置虚拟机名称以及存放磁盘位置2.6、按照需求…

哈尔滨工业大学DeepSeek公开课人工智能:从图灵测试到DeepSeek|附视频和PPT下载方法

导 读 INTRODUCTION 今天给大家分享一份哈尔滨工业大学发布的《从图灵测试到DeepSeek》&#xff0c;由哈尔滨工业大学人工智能学院执行院长兼计算学部副主任张伟男教授带你穿越AI发展简史&#xff0c;解锁从图灵测试的奠基性思想到DeepSeek大模型的技术突破&#xff0c;带你领…

【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树

目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…