当前位置: 首页 > news >正文

【CUDA】CUDA Hierarchy

【CUDA】CUDA 基本概念和 Hierarchy

CUDA 编程基础:Host 和 Device 工作流程

首先简单介绍CUDA 编程的基本概念:讲解 Host(CPU)与 Device(GPU)的区别、内存管理以及 CUDA 运行时的工作机制。


Host(主机) vs. Device(设备)

  • Host(CPU)
    • 执行通用代码(无需 CUDA 扩展)。
    • 使用主板上的 RAM 作为内存。
    • 运行标记为 __host__ 的函数。
  • Device(GPU)
    • 进行高效并行计算。
    • 使用 GPU 自带的 VRAM(视频内存、显存)。
    • 运行标记为 __global____device__ 的函数。

CUDA 程序运行流程

  1. 将数据从 Host 复制到 Device:使用 cudaMemcpy 传输输入数据到 GPU 的显存。
  2. 加载并执行 CUDA 内核:
    • 使用 GPU 并行执行内核函数(__global__)。
    • 内核函数处理传入的变量并完成计算。
  3. 将结果从 Device 复制回 Host:将处理后的数据从显存复制回主机内存。

CUDA 命名约定

  • 变量命名:
    • h_A:Host(CPU)上的变量,例如 A
    • d_A:Device(GPU)上的变量,例如 A
  • 函数修饰符:
    • __global__:GPU 上的内核函数,可以由 CPU 调用。它通常不返回值,而是通过修改传入的变量完成操作,例如矩阵乘法。
    • __device__:只能由 GPU 调用,用于在内核函数中执行特定任务。它类似于调用库函数,但只能在 GPU 内部执行。
    • __host__:只能在 CPU 上执行,与普通的 C/C++ 函数相似。

CUDA 内存管理

  • 显存分配: 使用 cudaMalloc 在显存中分配内存。

    float *d_a, *d_b, *d_c;
    cudaMalloc(&d_a, N * N * sizeof(float));
    cudaMalloc(&d_b, N * N * sizeof(float));
    cudaMalloc(&d_c, N * N * sizeof(float));
    
  • 内存拷贝: 使用 cudaMemcpy 在 Host 和 Device 间传输数据:

    • Host → Device(CPU → GPU):cudaMemcpyHostToDevice
    • Device → Host(GPU → CPU):cudaMemcpyDeviceToHost
    • Device → Device(GPU 内部或不同 GPU 之间):cudaMemcpyDeviceToDevice
  • 释放显存: 使用 cudaFree 释放分配的显存。

    cudaFree(d_a);
    cudaFree(d_b);
    cudaFree(d_c);
    

CUDA 编译器(nvcc)

  • Host 代码
    • 被修改以支持 CUDA 内核。
    • 编译为普通的 x86 二进制。
  • Device 代码
    • 编译为 PTX(并行线程执行)代码。
    • PTX 是跨 GPU 代的稳定中间表示,通过 JIT(即时编译)转为本地 GPU 指令,实现向前兼容。

CUDA 的并行计算模型是基于层次化的线程结构设计的,这种设计为大规模并行计算提供了高效管理线程的方式。以下是 CUDA 的核心层次结构:


层次结构概览

  1. Kernel:
    • 定义:CUDA 程序的核心计算函数,运行在 GPU 上。
    • 工作方式:通过网格 (Grid) 和块 (Block) 的组织方式来并行化任务。
  2. Thread:
    • 定义:GPU 的基本执行单元,每个线程独立运行。
    • 特性:每个线程有自己的寄存器和局部内存空间。
  3. Thread Block (Block):
    • 定义:线程的逻辑分组,一个 Block 包含若干个线程。
    • 重要性:Block 是 CUDA 的调度单元,提供线程间共享的共享内存。
    • 限制:每个 Block 中的线程数量有上限,通常是 1024 个线程(具体依赖于 GPU 架构)。
  4. Grid (网格):
    • 定义:Block 的逻辑分组,一个 Grid 包含若干个 Block。
    • 重要性:通过组织多个 Block 实现大规模并行任务。

CUDA 的工作流

  1. 用户定义一个 Kernel 函数,用于描述 GPU 上的计算。
  2. 调用时通过 <<<Grid, Block>>> 来指定 Grid 和 Block 的规模。
  3. GPU 硬件会为每个线程分配一个唯一的索引,这些索引用于访问内存和分配任务。

4 个核心术语

这4个变量都是内置变量,由编译器自动提供,供核函数使用。

1. gridDim ⇒ 网格的维度
  • 定义gridDim 定义了 Grid 在每个维度上的 Block 数量。

  • 类型:3D 变量,gridDim.x, gridDim.y, gridDim.z

  • 用途:决定网格规模,帮助计算全局索引。

  • 示例:

    dim3 grid(4, 3);  // 4 个 Block 在 X 方向,3 个 Block 在 Y 方向
    printf("Grid dimensions: %d x %d\n", gridDim.x, gridDim.y);
    

2. blockIdx ⇒ Block 的索引
  • 定义blockIdx 标识当前线程所属 Block 在 Grid 中的索引。

  • 类型:3D 变量,blockIdx.x, blockIdx.y, blockIdx.z

  • 用途:结合线程索引计算全局索引。

  • 范围[0, gridDim.{x|y|z} - 1]

  • 示例:

    int block_index = blockIdx.x;  // 当前 Block 在 X 方向的索引
    

3. blockDim ⇒ Block 的维度
  • 定义blockDim 表示每个 Block 在每个维度上的线程数量。

  • 类型:3D 变量,blockDim.x, blockDim.y, blockDim.z

  • 用途:用于定义 Block 内线程的局部索引范围。

  • 范围:由 Kernel 配置时的第二个参数决定。

  • 示例:

    dim3 block(16, 16);  // 每个 Block 包含 16x16 个线程
    printf("Block dimensions: %d x %d\n", blockDim.x, blockDim.y);
    

4. threadIdx ⇒ 线程的索引
  • 定义threadIdx 表示当前线程在所在 Block 中的索引。

  • 类型:3D 变量,threadIdx.x, threadIdx.y, threadIdx.z

  • 用途:配合 blockIdxblockDim 计算全局线程索引。

  • 范围[0, blockDim.{x|y|z} - 1]

  • 示例:

    int thread_index = threadIdx.x;  // 当前线程在 X 方向的索引
    

可以网格是由多个小长方体(block)组成的一个大长方体(grid),其中小长方体又是由多个更小的长方体(thread)组成。


线程束 (Warp)

定义
  • 线程束(Warp) 是 CUDA 调度的基本单元,每个 Warp 包含 32 个线程
  • Warp 内的线程以 SIMD(单指令多数据) 模式运行:所有线程执行相同指令,但操作的数据可以不同。

线程束的特性
  1. 执行同步
    • 一个 Warp 内的所有线程在同一个时钟周期内执行同一条指令。
  2. 线程束分歧 (Warp Divergence)
    • 如果 Warp 内的线程需要执行不同的分支(例如 if/else),Warp 会被拆分成多个子任务,依次完成分支,导致性能下降。
  3. 调度单位
    • Warp 是 CUDA 的硬件调度单位。一个 Block 中的线程数量如果不是 32 的倍数,会浪费部分调度资源。完整代码示例

实例

#include <stdio.h>__global__ void Whoami(void){int block_id = blockIdx.x + blockIdx.y * gridDim.x +blockIdx.z * gridDim.x * gridDim.y;int block_offset = block_id * blockDim.x * blockDim.y * blockDim.z;int thread_offset = threadIdx.x + threadIdx.y * blockDim.x +threadIdx.z * blockDim.x * blockDim.y;int id = block_offset + thread_offset;printf("%04d | Block(%d %d %d) = %3d | Thread(%d %d %d) = %3d\n",id, blockIdx.x, blockIdx.y, blockIdx.z, block_id,threadIdx.x, threadIdx.y, threadIdx.z, thread_offset);
}int main(int argc,char** argv){const int b_x = 2, b_y = 3, b_z = 4;const int t_x = 4, t_y = 4, t_z = 4;int blocks_per_grid = b_x * b_y * b_z;int threads_per_block = t_x * t_y * t_z;printf("%d block/grid\n", blocks_per_grid);printf("%d threads/block\n", threads_per_block);printf("%d total threads\n", blocks_per_grid * threads_per_block);dim3 blocksPerGrid(b_x, b_y, b_z);dim3 threadsPerBlock(t_x, t_y, t_z);Whoami<<<blocksPerGrid, threadsPerBlock>>>();cudaDeviceSynchronize();return 0;
}

这段代码展示了如何使用 gridDimblockIdxblockDimthreadIdx 来理解grid,block,thread的层级结构。通过输出你也会看到线程束 (Warp)的表现,block中的线程按32分为了两部分,所以同一个block的输出被分为了两部分。

参考:https://github.com/Infatoshi/cuda-course/tree/master/05_Writing_your_First_Kernels

相关文章:

【CUDA】CUDA Hierarchy

【CUDA】CUDA 基本概念和 Hierarchy CUDA 编程基础&#xff1a;Host 和 Device 工作流程 首先简单介绍CUDA 编程的基本概念&#xff1a;讲解 Host&#xff08;CPU&#xff09;与 Device&#xff08;GPU&#xff09;的区别、内存管理以及 CUDA 运行时的工作机制。 Host&#x…...

28.100ASK_T113-PRO Linux+QT 显示一张照片

1.添加资源文件 2. 主要代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QImage> #include <QPixmap>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow) {ui->setupUi(this);QIm…...

GitLab使用中遇到的一些问题-记录

错误内容一 Warning: Permanently added gitlab.com (ED25519) to the list of known hosts. gitgitlab.com: Permission denied (publickey). Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. …...

【微服务】Docker

一、Docker基础 1、依赖的兼容问题&#xff1a;Docker允许开发中将应用、依赖、函数库、配置一起打包&#xff0c;形成可移植镜像Docker应用运行在容器中&#xff0c;使用沙箱机制&#xff0c;相互隔离。 2、如何解决开发、测试、生产环境有差异的问题&#xff1a;Docker镜像…...

【C#】书籍信息的添加、修改、查询、删除

文章目录 一、简介二、程序功能2.1 Book类属性&#xff1a;方法&#xff1a; 2.2 Program 类 三、方法&#xff1a;四、用户界面流程&#xff1a;五、程序代码六、运行效果 一、简介 简单的C#控制台应用程序&#xff0c;用于管理书籍信息。这个程序将允许用户添加、编辑、查看…...

Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件&#xff1a; 安装Node.js&#xff1a;Node.js官网 下载Node.js安装包。建议选择L…...

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…...

【AI系统】Auto-Tuning 原理

Auto-Tuning 原理 在硬件平台驱动算子运行需要使用各种优化方式来提高性能&#xff0c;然而传统的手工编写算子库面临各种窘境&#xff0c;衍生出了自动生成高性能算子的的方式&#xff0c;称为自动调优。在本文我们首先分析传统算子库面临的挑战&#xff0c;之后介绍基于 TVM…...

AMEYA360:上海永铭电子全新高压牛角型铝电解电容IDC3系列,助力AI服务器电源高效运转

随着数据中心和云计算的高速发展&#xff0c;AI服务器的能效要求日益提高。如何在有限空间内实现更高的功率密度和稳定的电源管理&#xff0c;成为AI服务器电源设计的一大挑战。永铭推出全新高压牛角型铝电解电容IDC3系列&#xff0c;以大容量、小尺寸的创新特性&#xff0c;为…...

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…...

什么是 Socket?

Socket&#xff08;套接字&#xff09;是计算机网络编程中的一个重要概念&#xff0c;它用于在不同计算机之间进行通信。Socket 提供了一种机制&#xff0c;使得应用程序可以通过网络发送和接收数据。Socket 通信通常基于 TCP/IP 协议&#xff0c;但也可以使用其他协议&#xf…...

【版本控制】SVN安装到使用一条路讲解

文章目录 安装使用 Subversion (SVN) 是一款集中式版本控制系统&#xff0c;广泛应用于团队协作和代码管理中。尽管随着 Git 的兴起&#xff0c;集中式版本控制逐渐被分布式工具取代&#xff0c;但 SVN 仍在许多企业项目中发挥着重要作用。它的简单、稳定和易用特性&#xff0c…...

KVCKVO

KVC KVC意思是键值编码&#xff0c;是一种可以通过键名来访问对象属性的机制&#xff0c;也可以对属性进行赋值&#xff0c;包括私有属性&#xff0c;由于KVC的定义是对OC中的NSObject的扩展进行实现的&#xff0c;所以如果要使用KVC机制&#xff0c;那么这个类需要继承NSObje…...

PyQt设计界面优化 #qss #ui设计 #QMainWindow

思维导图 通过qss实现ui界面设计优化 Qss是Qt程序界面中用来设置控件的背景图片、大小、字体颜色、字体类型、按钮状态变化等属性&#xff0c;它是用来美化UI界面。实现界面和程序的分离&#xff0c;快速切换界面。 首先我们在Pytchram创建一个新目录 然后将我们所需要的图片打…...

Qt Serial Bus 前置介绍篇

文章目录 Qt Serial Bus 简介前言 什么是 Qt Serial Bus&#xff1f;Qt Serial Bus 的核心功能支持的协议1. **CAN 总线**2. **Modbus**3. **自定义协议** 应用场景优势总结 Qt Serial Bus 简介 前言 Qt Serial Bus 是 Qt 框架中的一个模块&#xff0c;用于与工业设备和嵌入式…...

12.2深度学习_项目实战

十、项目实战 鲍勃开了自己的手机公司。他想与苹果、三星等大公司展开硬仗。 他不知道如何估算自己公司生产的手机的价格。在这个竞争激烈的手机市场&#xff0c;你不能简单地假设事情。为了解决这个问题&#xff0c;他收集了各个公司的手机销售数据。 鲍勃想找出手机的特性(例…...

LeetCode 64. 最小路径和(HOT100)

第一次错误代码&#xff1a; class Solution { public:int minPathSum(vector<vector<int>>& grid) {int dp[205][205] {0};int m grid.size(),n grid[0].size();for(int i 1 ;i<m;i){for(int j 1;j<n;j){dp[i][j] min(dp[i][j-1],dp[i-1][j])gr…...

ESP8266作为TCP客户端或者服务器使用

ESP8266模块&#xff0c;STA模式&#xff08;与手机搭建TCP通讯&#xff0c;EPS8266为服务端&#xff09;_esp8266作为station-CSDN博客 ESP8266模块&#xff0c;STA模式&#xff08;与电脑搭建TCP通讯&#xff0c;ESP8266 为客户端&#xff09;_esp8266 sta 连接tcp-CSDN博客…...

C#结合.NET框架快速构建和部署AI应用

在人工智能&#xff08;AI&#xff09;的浪潮中&#xff0c;C#作为一种功能强大且类型安全的编程语言&#xff0c;为AI工程开发提供了坚实的基础。C#结合.NET框架&#xff0c;使得开发者能够快速构建和部署AI应用。本文将通过一个简单的实例&#xff0c;展示如何使用C#进行AI工…...

题外话 (火影密令)

哥们&#xff01; 玩火影不&#xff01; 村里人全部评论&#xff01; 不评论的忍战李全保底&#xff01; 哥们&#xff01; 密令领了不&#xff01; “1219村里人集合”领了吗&#xff01; 100金币&#xff01; 哥们&#xff01; 我粉丝没人能上影&#xff01; 老舅说的…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...