【并行计算】CUDA基础

news2024/11/17 1:54:50

cuda程序的后缀:.cu

编译:nvcc hello_world.cu

执行:./hello_world.cu

使用语言还是C++。

1. 核函数

__global__ void add(int *a, int *b, int *c) {
    *c = *a + *b;
}

核函数只能访问GPU的内存。也就是显存。CPU的存储它是碰不到的。

并且核函数不能使用变长参数、静态变量、函数指针。

核函数具有异步性。GPU无法控制CPU,CPU也不会去等GPU,所以需要同步,也就是显式调用同步函数。有些线程也是需要同步的。

编写CUDA程序:

int main(void){
    主机代码
    核函数调用
    主机代码
    return 0;
}

核函数不支持C++的iostream。

#include<stdio.h>
__global__ void hello_from_gpu(){
    printf("Hello from GPU!\n");
    __syncthreads();// 显式同步
}
int main(){
    hello_from_gpu<<<1,1>>>();// 显式调用核函数
    cudaDeviceSynchronize();// 显式同步
    return 0;
}

2. 线程块

int main() {
    int a = 1;
    int b = 2;
    int c;
    add<<<1, 1>>>(&a, &b, &c);
    return 0;
}

线程模型重要概念:

  1. grid网格
  2. block线程块

线程分块是逻辑上的划分,物理上线程不分块。

配置线程:<<<grid_num, block_num>>>

第一个参数代表着我们有M个线程块,第二个参数代表着我们的每个线程块中有N个线程。他们都是一维的。这昂个参数保存在内建变量(build-in variable)中。

gridDim.x: 该变量的数值等于执行配置中变量grid_num的值。

blockDim.x: 该变量的数值等于执行配置中变量block_num的值。

最大允许线程块的大小为1024。最大允许的网格大小是 2 3 1 − 1 2^31-1 2311(针对一维网格)。

实际使用中,总线程数大于实际使用的线程数能更好地利用计算资源,因为这样可以使得GPU在计算的时候内存访问同时进行,节省计算机计算的时间。使得核心一直处于计算中。

启动核函数后,CPU并不会等待核函数执行完毕,立马去执行主机中其他程序。所以我们要做的就是使得这两部分时间重叠。

3. 线程块的索引

int main() {
    int a = 1;
    int b = 2;
    int c;
    add<<<1, 1>>>(&a, &b, &c);
    return 0;
}

线程索引保存成内s建变量(build-in variable):

  1. blockIdx.x: 该变量指定一个线程在一个网格中的线程块索引值,范围0-girdDim.x-1。
  2. threadIdx.x: 该变量指定一个线程在线程块中的索引值,范围0-blockDim.x-1。

线程具有唯一标识:

I d x = t h r e a d I d x . x + b l o c k D i m . x ∗ b l o c k I d x . x ; Idx = threadIdx.x + blockDim.x * blockIdx.x; Idx=threadIdx.x+blockDim.xblockIdx.x;

4. 推广到多维线程

  1. CUDA可以组织三维的网格和线程块;

  2. blockIdx和threadIdx是类型为uint3的变量,该类型是一个结构体,具有x,y,z三个成员(3个成员都为无符号类型的成员构成):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 定义多维网格和线程块(C++构造函数语法):

dim3 grid_num(Gx,Gy,Gz);
dim3 block_num(Bx,By,Bz);

dim3 grid_num(2,2); // 等价于dim3 grid_num(2,2,1);
dim3 block_num(5,3); // 等价于dim3 block_num(5,3,1);

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5. 一维网格 一维线程块

定义grid和block尺寸:

dim3 grid_num(4);
dim3 block_num(8);

调用核函数:

kernel_fun<<<grid_num, block_num>>>(…);

具体的线程索引方式如图所示。

blockIdx.x从0到3,threadIdx.x从0到7。

计算方式:

I d x = t h r e a d I d x . x + b l o c k D i m . x ∗ b l o c k I d x . x ; Idx = threadIdx.x + blockDim.x * blockIdx.x; Idx=threadIdx.x+blockDim.xblockIdx.x;

6. 二维网格 二维线程块

定义grid和block尺寸:

dim3 grid_num(2,2);
dim3 block_num(5,3);

调用核函数:

kernel_fun<<<grid_num, block_num>>>(…);

具体的线程索引方式如图所示。

blockIdx.x从0到1,threadIdx.y从0到1。

blockIdx.x从0到1,threadIdx.y从0到3。

计算方式:

i n t b l o c k I d = b l o c k I d x . x + g r i d D i m . x ∗ b l o c k I d x . y ; i n t t h r e a d I d = t h r e a d I d x . x + b l o c k D i m . x ∗ t h r e a d I d x . y ; i n t i d = b l o c k I d ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ) + t h r e a d I d ; int blockId = blockIdx.x + gridDim.x * blockIdx.y; int threadId = threadIdx.x + blockDim.x * threadIdx.y; int id = blockId * (blockDim.x * blockDim.y) + threadId; intblockId=blockIdx.x+gridDim.xblockIdx.y;intthreadId=threadIdx.x+blockDim.xthreadIdx.y;intid=blockId(blockDim.xblockDim.y)+threadId;

7. 三维网格 三维线程块

定义grid和block尺寸:

dim3 grid_num(2,2,2);
dim3 block_num(5,3,1);

调用核函数:

kernel_fun<<<grid_num, block_num>>>(…);

具体的线程索引方式如图所示。

blockIdx.x、blockIdx.y和blcokIdx.z从0到1,

threadIdx.x、threadIdx.y从0到3,threadIdx.z从0到1。

计算方式:

i n t b l o c k I d = b l o c k I d x . x + g r i d D i m . x ∗ b l o c k I d x . y + g r i d D i m . x ∗ g r i d D i m . y ∗ b l o c k I d x . z ; i n t t h r e a d I d = ( t h r e a d I d x . z ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ) ) + ( t h r e a d I d x . y ∗ b l o c k D i m . x ) + t h r e a d I d x . x ; i n t i d = b l o c k I d ∗ ( b l o c k D i m . x ∗ b l o c k D i m . y ∗ b l o c k D i m . z ) + t h r e a d I d ; int blockId = blockIdx.x + gridDim.x * blockIdx.y + gridDim.x * gridDim.y * blockIdx.z; int threadId= (threadIdx.z * (blockDim.x * blockDim.y) ) + (threadIdx.y * blockDim.x) + threadIdx.x; int id = blockId * (blockDim.x * blockDim.y * blockDim.z) + threadId; intblockId=blockIdx.x+gridDim.xblockIdx.y+gridDim.xgridDim.yblockIdx.z;intthreadId=(threadIdx.z(blockDim.xblockDim.y))+(threadIdx.yblockDim.x)+threadIdx.x;intid=blockId(blockDim.xblockDim.yblockDim.z)+threadId;

三维网格、三维线程块如图所示:

https://github.com/user-attachments/assets/c57924c1-2157-4c73-87ea-36f6842e9eff

Reference

[1]. 权双.CUDA编程基础入门系列(持续更新)[M/OL](2023-07-14)[2024-08-21].https://www.bilibili.com/video/BV1sM4y1x7of/?p=7&share_source=copy_web&vd_source=8b2bc57e71349607b55c9fde6b078ebd

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技术解析】工厂内部导航系统:高精度定位与智能路径规划的技术实现

一、工厂内部导航系统概述 工厂内部导航系统集成了最新的GPS室内定位技术、蓝牙定位技术&#xff0c;实现了对工厂内部环境的无缝覆盖与高精度定位。无论是繁忙的生产线、错综复杂的仓库还是广阔的厂区&#xff0c;都能轻松应对。 二、工厂内部导航系统核心功能 实时定位&…

PromptReps: 解锁LLM的检索力量

论文&#xff1a;https://arxiv.org/pdf/2404.18424代码&#xff1a;https://github.com/ielab/PromptReps机构&#xff1a;CSIRO、昆士兰大学、滑铁卢大学领域&#xff1a;retrieval、embedding model发表&#xff1a;arXiv 当前大型语言模型用于zero-shot文档排序的方法主要有…

台球助教系统开发概述:技术架构与功能实现

在现代体育训练领域&#xff0c;技术的融合正不断推动运动教学方式的革新。台球&#xff0c;作为一项集策略、技巧与心理素质于一体的运动&#xff0c;其教学过程的优化显得尤为重要。因此&#xff0c;开发一套高效、智能的台球助教系统&#xff0c;旨在通过技术手段提升学员的…

【微处理器系统原理与应用设计第五讲】再探Cortex-M4处理器结构、总线、异常与中断、SysTick

一、处理器结构 如下图所示&#xff0c;主要包括处理器内核、嵌套向量中断控制器&#xff08;NVIC&#xff09;、系统节拍定时器&#xff08;SysTick&#xff09;以及可选的浮点单元&#xff0c;还有一些内部总线系统、可选的存储器保护单元&#xff08;MPU&#xff09;以及支…

【AI】前向和反向传播的关系

这个例子来自ChatGPT&#xff0c;很有趣的解释了一个模型在trian的过程中前向传播和反向传播的过程。 其中Sigmoid的导数是 自身乘以1-自身的结果。 这也是上述式子中为什么有0.622*&#xff08;1-0.622&#xff09;。

Android Telephony总结

1、Telephony 业务介绍 Android telephony涉及较多模块 1.1、STK业务介绍 1.1.1、STK域选 1.1.2、是否支持STK Telephon STK-CSDN博客 1.1.3、STK应用的安装卸载 1.2、SS补充业务 1.3、通话业务 1.3.1、紧急号码 ECC 号码总结_ecc号码-CSDN博客 1.4、SMS 1.4.1 短信发送方式…

相亲交友系统如何运用算法匹配理想伴侣

在数字化时代&#xff0c;相亲交友系统已经成为寻找理想伴侣的重要途径。作为程序员&#xff0c;我们致力于通过先进的算法&#xff0c;为用户提供精准的匹配服务&#xff0c;让相亲交友变得更加高效和有趣。 相亲交友系统的核心在于算法&#xff0c;我们的团队运用了多种算法…

一线大厂软件测试面试题及答案解析,2024最强版...

1、什么是兼容性测试?兼容性测试侧重哪些方面? 参考答案: 兼容测试主要是检查软件在不同的硬件平台、软件平台上是否可以正常的运行&#xff0c;即是通常说的软件的可移植性。 兼容的类型&#xff0c;如果细分的话&#xff0c;有平台的兼容&#xff0c;网络兼容&#xff0…

达梦创建新连接

小伙伴是不是遇到过什么都没有的达梦数据库页面&#xff0c;很慌 我们直接点击窗口——视图——对象导航 出来了以后&#xff0c;点击小图标进行新建链接 输入自己的密码用户名&#xff0c;就能新建一个链接了&#xff0c;希望可以帮助到各位小伙伴

软件测试之压力测试知识总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&…

window系统开机执行bat脚本

1&#xff0c;win R 打开运行对话框&#xff0c;然后如下图所示输入 第二&#xff0c;打开启动文件夹后&#xff0c;将想要执行的bat脚本&#xff0c;创建快捷方式&#xff0c;放在这里&#xff0c;重启电脑时就会执行这个程序

银行接口测试的具体流程及内容?

银行接口测试的具体流程及内容可以概括为以下几个关键步骤&#xff1a; 一、测试前准备 接口测试计划制定&#xff1a; 确定测试目标、范围、人员分工、时间计划等。 编写接口测试计划文档&#xff0c;明确测试策略、测试方法、测试工具等。 接口文档解析&#xff1a; 深入理…

Linux进程状态 僵尸进程 孤儿进程

进程状态 R (running) Linux 的运行状态(循环空语句) S (sleeping) 阻塞状态 称为浅度睡眠(可以被唤醒)死循环打印语句时等待输入时使用 sleep 函数时 D (disk sleep) 也是一种阻塞状态&#xff0c;称为深度睡眠进程在等待磁盘写入完毕期间&#xff0c;这个进程不能被任何人杀…

一键云迁移:利用VMware PowerCLI将OVA虚拟机顺利迁移到AWS

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;。 “ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…&#xff08;每天更新不间断&#xff0c;福利…

【学习AI-相关路程-工具使用-自我学习-jetson收集数据-图片采集-训练前准备-基础样例 (5)】

【学习AI-相关路程-工具使用-自我学习-jetson&模型训练-图片识别-使用模型检测图片-基础样例 &#xff08;5&#xff09;】 1 -前言2 -环境说明3 -先行了解&#xff08;1&#xff09;整理流程了解&#xff08;2&#xff09;了解模型-MobileNet1、MobileNetV2 的主要特性&am…

大模型推理框架 RTP-LLM 架构解析

RTP-LLM 是阿里巴巴智能引擎团队推出的大模型推理框架&#xff0c;支持了包括淘宝、天猫、闲鱼、菜鸟、高德、饿了么、AE、Lazada 等多个业务的大模型推理场景。RTP-LLM 与当前广泛使用的多种主流模型兼容&#xff0c;使用高性能的 CUDA kernel, 包括 PagedAttention、FlashAtt…

gpt plus获取指南

随着AI技术的发展&#xff0c;越来越多的人开始依赖GPT来提高工作效率。市场上有多个平台提供GPT服务&#xff0c;如何选择最适合自己的&#xff1f;本文将详细对比两个热门平台&#xff1a;「银河」和「环球」&#xff0c;帮助你快速决策。 环球链接 银河链接 结论先行&#…

预测赢家00

题目链接 预测赢家 题目描述 注意点 1 < nums.length < 200 < nums[i] < 10^7假设每个玩家的玩法都会使他的分数最大化如果两个玩家得分相等&#xff0c;同样认为玩家1是游戏的赢家 解答思路 需要注意的是&#xff0c;如果数组中的元素个数为偶数&#xff0c;…

Golang环境安装、配置详细

Windows下安装Go开发环境 点我下载 Windows配置Go环境变量 出现工具install失败时&#xff0c;切换其它代理 # 1. 七牛 CDN go env -w GOPROXYhttps://goproxy.cn,direct# 2. 阿里云 go env -w GOPROXYhttps://mirrors.aliyun.com/goproxy/,direct# 3. 官方 go env -w GOP…

波场(Tron)监听区块交易(TRX,USDT)

前言说明&#xff1a; 本篇文章参考GitHub一位伙伴的代码&#xff0c;再代码基础上优化改良以后的结果&#xff0c;但是一下找不到那位大佬的GitHub链接了&#xff0c;如有侵权请联系作者调整文章&#xff0c;让跟多人收益。谢谢。 实现思路: 波场链是一条很新奇的链&#xff…