CUDA下的GPU编程--线程和变量

【cuda基础】1 cuda 编程简介 简介 这是这个系列的第一篇入门文章,这个系列的博客不会讲解太多的东西,毕竟官方文档就是最好的教程,这个系列的博客主要是写一些 cuda 代码跑起来试试,记录下自己的学习收获。 官方文档就是最好最权威的学习资源 CUDA Toolkit Documentation v11.7.0 此外作为入门,个人觉得这篇文章是很不错的 ,强烈建议先看完下面这篇文章。 CUDA编程入门极简教程 它主要是翻译自这篇文章 even-easier-introduction-cuda GPU简介 简而言之,GPU加速就是利用 阅读详情

CUDA的线程是多维的,启动一个线程格,线程格可以是多维的,线程格中分为线程块,线程块也可以是多维的,线程块中包含线程,对于GPU来说,同时启动200万个线程是很轻易的事情。

blockIdx :当前执行设备代码的线程块的索引

dim3 grid(DIM,DIM):声明一个二维的线程格,名字为grid;

kernel<<<grid,1>>(dev_t):线程块为一个二维线程块,每个线程块有一个线程

gridDim:保存线程格每一维的线程块的数量

blockDim:保存的是线程块中每一维的线程数量

若线程块和线程格都是一维的:

blockDim.x * gridDim.x表示的是总共线程数量。

 

CUDA定义的函数和变量方式有 __global__ ­ __device__ 和__shared__,

__global__函数直接告诉编译器,这个函数是在GPU上执行的,不是在CPU上执行,可以在主函数中直接调用(主函数中的代码如果没有特别说明都是在CPU上运行的),此时该函数会自动交由GPU执行。__global__只能写在主函数中。

声明格式:__global__ add(int *a){}

调用格式:add<<<N,M>>>(dev_t);(启动线程块为N,每个线程块有M线程的线程集去执行add(dev_t)函数.

 

__device__可以定义GPU全局变量和函数,表示该变量或函数是保存在GPU上的,代码也是在GPU上执行的,与__global__不同的是,__device__只能在__device__函数或__global__中调用,不能直接写在主函数。

 可以直接在主函数中声明一个普通的变量指针,如int *dev_t,然后再由主函数中调用HANDLE_ERROR(cudaMalloc(  (void**) &dev_t,sizeof(int) ) );就可以给dev_t分配一个GPU内存上的地址,也就是说dev_t指向的是GPU的地址,此后不能在CPU执行的代码中调用该指针,因为CPU的内存跟GPU的内存不是共享的,只能在__global__或者是__device__函数中调用该指针。如果要实现CPU和GPU的通信,只能通过拷贝地址函数将GPU上某段内存拷贝到主存上。比如若GPU中计算好了一个值在指针dev_t所指的int区域,要返回给CPU的t变量话,HANDLE_ERROR(cudaMemcpy( &t , dev_t, sizeof(int),cudaMemcpyDeviceToHost ));

 

__shared__声明的变量,这个变量会驻留在共享内存中,对于在GPU上启动的每个线程块,CUDA编译器都会创建该变量的一个副本,线程块中的每个线程都共享这块内存,但是线程却无法看到也不难修改其他线程块的变量副本。使得一个线程块中的多个线程能在计算机上进行通信和协作,访问共享内存的延迟要远低于访问普通缓冲区的延迟。

 

__constant__ 常量内存保存在设备函数执行期间不会发生变化的数据,nvidia硬件提供了64KB的常量内存。常量内存里的变量声明也要加上 __constant__修饰符,如果是数组的话,要在编译时为这个数组提交一个固定的大小,如__constant__ int a[10]。

当从主机内存复制到GPU上的常量内存时,不使用cudaMemcpy(),用cudaMemcpyToSymbol()。

线程束是指一个包含32个线程的集合,多个线程集合被“编织在一起”并以步调一致“的形式执行,在程序中的每一行,线程束中的每个线程都将在不同的数据上执行相同的指令。如果在半线程束中的每个线程都从常量内存的相同地址上读取数据,那么GPU只会产生一次读取请求并在随后将数据广播到每个线程,如果从常量内存中读取大量的数据,那么这种方式产生的内存流量指示全局时的1/16。但是当半线程束中的所有16个线程需要访问常量内存中不同数据,那么这个16次不同的读取请求操作会被串行化,反而影响效率。

 

设备执行的代码中可以使用__syncthreads()进行对线程块中的线程进行同步,可以确保线程块中的每个线程都执行完__syncthreads()前面的语句后,才会执行下一条语句。

 

CUDA编程指南阅读笔记(一) 随着多核CPU和众核GPU的到来,并行编程已经得到了业界越来越多的重视,CPU-GPU异构程序能够极大提高现有计算机系统的运算性能,对于科学计算等运算密集型程序有着非常重要的意义。这一系列文章是根据《CUDA C语言编程指南》来整理的,该指南是NVIDIA公司提供的CUDA学习资料,介绍了CUDA编程最基本最核心的概念,是学习CUDA必不可少的阅读材料。 初学CUDA,笔记错误之处在所难免,还请 阅读详情

相关推荐

CUDA:实现下文的管理和多GPU上的多线程并发(附完整源码)

CUDA:实现下文的管理和多GPU上的多线程并发(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 400

CUDA多线程编程

CUDA多线程编程

ashiners的博客 1771

MT5交易软件系统源码

Manager配置的功能及权限:管理客户、开户,销户、入金、信用额度、修改定单、人工交易报表、设定点差、强制平仓、修改密码,设定持仓交割单或挂单小止盈止损点数;26、修改价格 27、更改K线图历史价格 28、同步历史数据;2、系统设置 3、交易管理 4、交易柜台 5、价格更改 6、多台服。务器联机 7、恢复交易历史 8、数据源调整 9、备份服务调整 10、交易市场设定 11、交易单更改 12、平台时间设定(全世界) 13、可添加商品;15、设置商品利息;独立主机(服务器、VPS、VM)

tutujunjun的博客 904

CUDA编程笔记(9)

线程数基本函数与协助组

weixin_41311686的博客 1512

关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

帮助你解决在使用CMT2300A 时遇到的各种问题,若有需要,请及时与我交流

teleger的博客 1428

三、Crowd与JIRA、Confluence用户集成并SSO单点登录

补充说明: 通过此方法集成后,用户、组以及用户和组的关系都在Crowd系统中存储,但各个系统的权限仍由各系统控制,也可在JIRA和Confluence中添加和删除用户。 在做步骤4和步骤5的时候,要特别小心,确保当前系统的超级权限用户(一般为admin,具体看当前系统的全局权限配置)和组以及它们的关系已经在Crowd中同样存在了,才可切换并禁用当前系统的内部用户目录,否则可能造成权限丢失等严重问题(因为禁用了内部用户目录,而Crowd中又不存在这个超级权限用户和组或它们的关系,所以权限就丢失了) 维护示例

weixin_38621072的博客 2985

CUDA CUDA C++ 编程指南

CUDA 编程指南目录

caocaoshiwang的博客 1400

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 361

CUDA编程模型

GPU计算基础知识 CUDA编程模型是一个异构模型,需要CPU和GPU协同工作 在CUDA中,host和device是两个重要的概念,我们用host指代CPU及其内存,而用device指代GPU及其内存。 CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。 host与device直接可以进行通信,这样它们之间可以进行数据拷贝。 CUDA程序执行流程 1.分配host内存,并进行数据初始化; 2.分配device内存,并从host将数据拷贝到devi..

小男孩儿的博客 565

ENSP内使用wireshark进行抓包,并且解析icmp报文

前四位:54 89 98 e8 20 38 为ip报文包的mac地址也就是物理地址。一开始进行抓包是没有icmp报文的,需要我们在ensp中使用pc1请求联通pc9。协议编号后分别为:ip版本、ip首部报文长度、服务类型、ip报文总长度。最后为校验和 、源ip地址、目的ip、从08 00开始为真正的数据。我们需要实验的端口为:0/0/4,也就是抓包第三个交换机内的报文。其中显示的icmp报文就是我们需要解析的ip报文。源mac地址后跟着的就是协议编号: 08 00。根据ip报文包的结构我们进行解析。

2301_81713278的博客 2138

本地搭建 GitLab 14.1.0版本CI/CD

GitLab 镜像版本 gitlab/gitlab-ce:14.1.0-ce.0 GitLab Runner 镜像版本 gitlab/gitlab-runner:v14.1.0 搭建此套环境是在一台32G的windows电脑上安装的。 使用dokcer安装。 此外还涉及的软件Docker Desktop,WSL 安装GitLab 首先启动 dockcer,打开WSL 打开后 首先定义GitLab的持久化目录 export GITLAB_HOME=/srv/gitlab 然后运行安装GitLab的命令

知无涯 4491

《Cuda编程》学习笔记(一)

cuda编程的学习笔记

m0_66513892的博客 223

哨兵1号回波数据(L0级)FDBAQ压缩算法详解

本文介绍哨兵1号用的FDBAQ算法,它实现非整数可变bit压缩,大部分数据仅需 3bit输出,少数高反射率数据需4bit输出,使得平均输出比特率刚超过3bit,比熵约束分块自适应量化 (ECBAQ)压缩算法所需的3.7bit更低。也就是说FDBAQ压缩完,除了要记录分块尺寸和各块的均值码(对应哨兵1号数据包里的THIDX)外,还需要记录霍夫曼码字的长度(对应哨兵1号数据包里的BRC)。唯一不同的就是量化后的编码规则使用了霍夫曼编码,相当于在传统的BAQ压缩流程的后面又加了一个步骤。

2301

CUDA编程入门

目录1 [GPU硬件架构及运行机制](https://www.cnblogs.com/timlly/p/11471507.html) 1 GPU硬件架构及运行机制 文章写的很全面

小P的博客 715

手把手教你学simulink(26.7)--控制算法场景示例:基于模型预测控制(MPC)的智能温室环境控制系统

首先,我们需要将温室环境的动力学模型转换为状态空间形式。假设我们有四个状态变量:温度 TT、湿度 HH、光照强度 II 和二氧化碳浓度 CCO2CCO2​,以及四个控制输入:加热器功率 u1u1​、加湿器加湿量 u2u2​、通风扇风速 u3u3​ 和补光灯光照强度 u4u4​。状态空间模型可以表示为:x(t)=[T(t),H(t),I(t),CCO2(t)]Tx(t)=[T(t),H(t),I(t),CCO2​(t)]T 是状态向量。

MHD0815的博客 400

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《CUDA并行程序设计:GPU编程指南》笔记 Chaper 5 线程网格、线程块、线程束

线程网格、线程块、线程束 关系 为了将数据放到GPU上运算 首先要通过cudaMalloc和cudaFree申请或释放内存 然后使用cudaMemcpy将数据从CPU端复制到GPU CUDA 中的相关变量含义 gridDim.x – 线程网格X维度上线程块的数目 gridDim.y – 线程网格Y维度上线程块的数目 blockDim.x – 一个线程块X维度上的线程数量 b...

steppad 772

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

CUDA编程之线程管理

当内核函数开始执行,如何组织GPU的线程就变成了最主要的问题了,我们必须明确,一个核函数只能有一个grid,一个grid可以有很多个块,每个块可以有很多的线程,这种分层的组织结构使得我们的并行过程更加自如灵活: ...

小铅笔 780

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

cuda编程快速了解

原文链接 https://zhuanlan.zhihu.com/p/34587739。

点滴的岁月 570

cuda编程入门 了解

知乎推荐的学习资料入门cuda https://face2ai.com/CUDA-F-1-1-%E5%BC%82%E6%9E%84%E8%AE%A1%E7%AE%97-CUDA/ CPU架构和GPU架构 异构 ALU:四核 (算术逻辑arithmetic logic unit) control:控制器 cache:缓存在片上 DRAM:内存总线上 GPU 小绿色块:ALUs,公用一组 control cache 相当于多了许多ALUs的cpu核 控制能力减弱,但是计算能力提升 主机代码he 设备代

weixin_44523062的博客 1139

CUDA学习笔记

CUDA学习笔记 目录 CUDA学习笔记 函数类型限定符 __global__ __host__ __device__ 变量类型限定符 __device__ __shared__ __constant__ CUDA线程概念 网格(Grid)、线程块(Block)和线程(Thread)的组织关系 线程索引的计算公式 dim3结构类型 函数类型限定符 __global_...

AI吃大瓜的博客 2156

VS2017 CUDA编程学习6: GPU存储器架构

文章目录前言1. GPU存储器架构总结学习资料 VS2017 CUDA编程学习1:CUDA编程两变量加法运算 VS2017 CUDA编程学习2:在GPU上执行线程 VS2017 CUDA编程学习3:CUDA获取设备上属性信息 VS2017 CUDA编程学习4:CUDA并行处理初探 - 向量加法实现 VS2017 CUDA编程学习5:CUDA并行执行-线程 前言 今天又复习了下GPU存储器架构,这里做下笔记以此来加深印象并分享给大家,希望能对大家有帮助。 1. GPU存储器架构 GPU存储器空间按照层次结

DU_YULIN的博客 607

CUDA编程入门系列(三) CUDA编程模型

_host_:在host上执行,仅可以从host上调用,一般省略不写,不可以和global_同时用,但可和_device__,此时函数会在device和host都编译。对于一个2-dim的block,线程的ID值为,如果是3-dim的block ,线程的ID值另外线程还有内置变量gridDim,用子获得网格块各个维度的大小。其中,最重要的一个过程是调用CUD的核函数来执行并行计算,核函数kernel是CUDA中一个重要的概念,kernel核函数是在GPU上线程中并行执行的函数。

qq_45788429的博客 384

【Lesson 3】CUDA 编程模型:线程、块、网格 —— Ubuntu 22.04 + RTX 30/40 系列实战

本文介绍了CUDA编程中的线程层级结构和索引计算。首先检查GPU环境配置,解释了网格(整个任务)、线程块(工作组)和线程(工人)的三层结构关系。详细说明了内置变量threadIdx、blockIdx等的用法,并给出了一维和二维情况下的全局线程ID计算公式。通过向量加法和图像负片处理两个实战案例,演示了如何分配线程块和网格,并实现并行计算。最后提供了NsightCompute调优工具的使用方法和常见错误解决方案。内容涵盖了CUDA编程的关键概念和实用技巧,为后续深入学习奠定基础。

小钻风的博客 1191

让Python飞起来: CUDA Python详细教程(含环境配置和源码)

CUDA Python详细教程(含环境配置和源码) 环境配置 安装Anaconda 因为本次课程课件描述部分是以ipython文件形式呈现,对于windows用户需要配置Jupyter-lab。如您已经有了可以查看ipython文件的环境,可以忽略此步骤 下载地址,并按照程序步骤安装: https://www.anaconda.com/products/individual#Downloads 安装CUDA 下载CUDA工具包并按照程序步骤安装:https://developer.nvidia.co

专注于人工智能领域的小何尚 2万+
上一篇: 搭建ASP.NET网站全攻略
HusonChen
博客等级 码龄15年 14粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值