CUDA——SM中warp调度器调度机制&&访存延迟隐藏

2023-10-29

SM中warp调度器调度机制&&访存延迟隐藏

核函数中并不是所有线程一起启动执行的,核函数的执行是以线程束(warps)作为单位,warps的执行由warp调度器进行调度,一个调度器只能调度一个warp去执行指令,一个warp里的所有线程几乎是同时执行的。
以一个warps调度器为例子:
假设一个核函数开启了128个线程,那么其被划分成4个warps。

1、调度器调度warp0执行指令。

warp0正在处理

2、warp0挂起(在进行访存),调度器调度warp1执行指令

在这里插入图片描述

3、以此类推,只要有处于Ready Queue的warps,且当前的运算单元没被占用时,warp调度器就会调用Ready Queue的warps去执行指令。直到warps都挂起。

所有的warp都处于挂起

4、若此时无warp在进行运算,且所有的warp都处于挂起状态。(假设SM上其它的块也挂起),那么就会产生访存延迟。

就是出现了都在访存,而没有进行运算的情况,这就浪费了很多时间。因此,如果一个warp的访存周期T里刚好是warp处理指令时间周期t的k倍,那么只需要k个warp即可隐藏访存带来的延迟。当第k个warp运算完之后,第一个warp也就刚好访存完毕,又处于Ready Queue状态,可随时被warp调度器调度去干活,没有浪费一丝运算的时间,这样就能使得程序的性能得到提升。
warp0运算结束,warp1随即被挂起

5、如何解决访存延迟?

通过以上几点,我们明确了访存延迟出现的原因。访存是有先后顺序的(SM、调度器是有限的)。
(1)应该让先访存完毕的warp去执行尽可能多的指令(不然运算单元空着也是浪费啊),去隐藏其它warp的访存时间。
(2)增加active warps的数量,让尽可能多的warp去隐藏访存延迟。(这个有局限性,warps是有限的)

6、现实中如何编写?

a、可以先写一个核函数,测试一下数据访存所花的时间,记下时间T1。

__global__ void obj_norm(float *input, float *output, size_t data_size)
{
	unsigned int ix = threadIdx.x + blockIdx.x*blockDim.x;
	unsigned int iy = threadIdx.y + blockIdx.y*blockDim.y;
	unsigned int i = ix + iy * blockDim.x*gridDim.x;

	if (i < data_size)
	{
		output[i] = input[i];
		//float value = input[i];
	}
}

b、将核函数具体执行的代码写下来,记下时间T2,若指令执行的时间可以隐藏访存时间。
那么,T2≈T1。此时,可以看作访存的时间全用来进行指令执行操作了。

__global__ void obj(float *input, float *output, size_t data_size)
{
	unsigned int ix = threadIdx.x + blockIdx.x*blockDim.x;
	unsigned int iy = threadIdx.y + blockIdx.y*blockDim.y;
	unsigned int i = ix + iy * blockDim.x*gridDim.x;

	if (i < data_size)
	{
		output[i] = __cosf((__logf(input[i])));
		//float value = (__logf(input[i])) / 24.5f;
	}
}

c、编写核函数应该尽量满足T1≈T2,最大化去隐藏访存时间。若T2远大于T1,则考虑将指令挪到其它“未饱和”的核函数(不能够完全隐藏访存时间的核函数)内执行。

d、当访存时间很大,且无法优化时,要用足够多的指令或者增加active warps的数量去隐藏访存时间。(一般写核函数肯定是需要对数据进行运算处理的,一定会有加减乘除以及一些其它的指令的)。

最后

GPU在硬件上并不是严格的并行,但通过warp的调度,块在SM上的调度等等流水线模式,使得在软件层面看起来是并行的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA——SM中warp调度器调度机制&&访存延迟隐藏 的相关文章

  • 无法在 CUDA 中执行设备内核

    我正在尝试在全局内核中调用设备内核 我的全局内核是矩阵乘法 我的设备内核正在查找乘积矩阵每列中的最大值和索引 以下是代码 device void MaxFunction float Pd float max int x threadIdx
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • 无法满足显式设备规范“/device:GPU:0”,因为没有匹配的设备

    我想在我的 Ubuntu 14 04 机器上使用 TensorFlow 0 12 作为 GPU 但是 当将设备分配给节点时 我收到以下错误 InvalidArgumentError see above for traceback Canno
  • CUDA、NPP 滤波器

    CUDA NPP 库支持使用 nppiFilter 8u C1R 命令过滤图像 但不断出现错误 我可以毫无问题地启动并运行 boxFilterNPP 示例代码 eStatusNPP nppiFilterBox 8u C1R oDeviceS
  • 如何为 CUDA 内核选择网格和块尺寸?

    这是一个关于如何确定CUDA网格 块和线程大小的问题 这是对已发布问题的附加问题here https stackoverflow com a 5643838 1292251 通过此链接 talonmies 的答案包含一个代码片段 见下文 我
  • GPU的编程语言有哪些

    我读过一篇文章 指出 GPU 是超级计算的未来 我想知道在GPU上编程使用什么编程语言 OpenCL 是开放式跨平台解决方案 可在 GPU 和 CPU 上运行 另一个是 NVIDIA 为其 GPU 构建的 CUDA HLSL Cg 等少数几
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 大型跨平台软件项目的技巧/资源

    我将开始一个大型软件项目 涉及跨平台 GUI 和大量的数字运算 我计划用 C 和 CUDA 编写大部分应用程序后端 并用 Qt4 编写 GUI 我计划使用 Make 作为我的构建系统 这将是一个只有两名开发人员的项目 一旦我相对深入地了解它
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • CUDA 的嵌套循环

    我想将我的 C 代码移植到 CUDA 主要计算部分包含3个for嵌套循环 for int i 0 i lt Nx i for int j 0 j
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • GPU上动态分配内存

    是否可以在内核内的 GPU 全局内存上动态分配内存 我不知道我的答案有多大 因此我需要一种方法为答案的每个部分分配内存 CUDA 4 0 允许我们使用 RAM 这是一个好主意还是会降低速度 可以在内核中使用 malloc 检查以下内容 摘自
  • 使用 GPU 进行 Matlab 卷积

    我用gpuArray尝试了matlab的卷积函数conv2 convn 例如 convn gpuArray rand 100 100 10 single gpuArray rand 5 single 并将其与 cpu 版本 convn ra
  • 使用 cudamalloc()。为什么是双指针?

    我目前正在浏览有关的教程示例http code google com p stanford cs193g sp2010 http code google com p stanford cs193g sp2010 学习CUDA 演示的代码 g

随机推荐

  • Jetty, “No multipart config for servlet” problem

    I m writing handler for file transfer The request is multipart HTTP message The message is correct tested on other serve
  • Python爬虫:解决SSL证书验证问题

    如果目标网站没有设置好HTTPS证书 又或者网站的HTTPS证书不被CA机构认可 用浏览器访问的话 就可能会出现SSL证书错误的提示 用requests库来请求这类网站的话 会直接抛出SSLError错误 requests exceptio
  • ssh命令详解

    基础命令学习目录 SSH 远程连接工具 连接原理 ssh服务是一个守护进程 demon 系统后台监听客户端的连接 ssh服务端的进程名为sshd 负责实时监听客户端的请求 IP 22端口 包括公共秘钥等交换等信息 ssh服务端由2部分组成
  • C++知识积累:explicit关键字的作用

    explicit意为 显式的 该关键字主要是用于防止类构造函数出现隐式类型转换的情况 且只适用于仅含一个参数的构造函数 我们先来看第一个问题 什么是防止构造函数出现隐式转换呢 来看下面的例子 class A public A int a c
  • React-router v5和v6的区别对比

    以下是两个版本之间的区别 一 首先是注册路由的时候v5的Switch改为了Routes v5 代码如下 import Route Switch from react router dom 引入react router div 注册路由 编写
  • spring boot默认扫描的路径

    一般来说spring boot默认的扫描路径是启动类当前的包和子包 SpringBootApplication EnableTransactionManagement proxyTargetClass true MapperScan bas
  • CSS 新特性总结

    CSS 伪类选择器 is 和 where is 将选择器列表作为参数 并选择该列表中任意一个选择器可以选择的元素 其优先级是由它的选择器列表中优先级最高的选择器决定的 列表值中不能使用伪元素 where 将会选择所有能被该选择器列表中任何一
  • 自己编写驱动,应用层程序,在应用层通过ioctl控制LED灯流水,当按键KEY1按下,让风扇转动

    驱动文件 include
  • 海康威视人脸门禁对接开发(一)准备篇

    前一段时间在HR系统中做了一个人脸识别考勤的模块 主要功能 设备注册 下发卡号与人脸 获取卡号与人脸 删除卡号与人脸 对设备布防 报警回调函数 首先在Window上开发 我们项目的JDK是1 6 64位 所以必须要用Win64的SDK开发包
  • 解决Unity3D提示‘Newtonsoft‘could not be found

    原因 Newtonsoft是一个C 中使用Json来进行数据的交互的程序集 1 与Unity自带的插件版本有关系 不能识别到包中的Newtonsoft 2 未导入Newtonsoft dll程序集 提醒你的代码路径 error CS0246
  • win10设置小鹤双拼

    可以使用注册表双击执行或者按步骤操作 Windows Registry Editor Version 5 00 HKEY CURRENT USER Software Microsoft InputMethod Settings CHS En
  • 音视频基础之封装格式与音视频同步

    封装格式的概念 封装格式 也叫容器 就是将已经编码压缩好的视频流 音频流及字幕按照一定的方案放到一个文件中 便于播放软件播放 一般来说 视频文件的后缀名就是它的封装格式 封装的格式不一样 后缀名也就不一样 比如 同样的陷可以做成饺子也可以做
  • php 定义float,MySql中float类型含义及参数详解

    php 定义float MySql中float类型含义及参数详解 float表示浮点数 通俗点来说的话 我们可以简单理解为小数 参数有两个 M表示精度 表示浮点数的位数 D表示标度 表示小数位数 M位数不包括小数点位数 举例 float 6
  • Excel如何将引用的sheet名称全部替换。

    一 设置引用sheet名称 例如为星期2 输入公式 引用A2行内容 星期2 A2 符号为固定单元格 二 将表格3星期3的内容引用到星期一表格中 三 将星期3内容引用到星期一 星期3 A2 如何将星期2全部换成星期3呢 四 将星期1的复制到新
  • 智能制造MES系统的主要内容有哪些?系统有什么作用?

    制造企业非常关注实现生产过程中的实时采集 提高生产排产的效率 实现制造过程的追溯 提升工人与设备的绩效 保证产品质量等问题 调研数据显示 92 的企业渴望加强对生产过程的控制 大多数制造企业已经逐渐清醒地认识到生产技术领先和制造过程管理高效
  • Linux操作系统常见面试题(持续更新)

    1 熟悉命令netstat tcpdump ipcs ipcrm netstat 检查网络状态 tcpdump 截获数据包 ipcs 检查共享内存 ipcrm 解除共享内存 2 共享内存段被映射进进程空间之后 存在于进程空间的什么位置 共享
  • uni-app在真机调试下兼容ethers的方法

    目录 一 安装ethers 二 renderjs 三 注意事项 uni app开发跨平台应用程序 项目搭建主要前端框是Uni app Vue3 TS Vite 项目搭建参考文章Uni app Vue3 TS Vite 创建项目 Hbuild
  • tac_plus安装和配置

    安装 将 http download csdn net detail wingking84 5814131 解压 PROJECTS放到 root下 进入PROJECTS然后执行 make make install 配置 将参考配置文件 ht
  • 英国加密货币流动性提供商获得金融监管机构批准

    点击上方 蓝色字 可关注我们 暴走时评 根据金融行为监管局 FCA 的注册记录 英国加密货币流动性创业公司B2C2 OTC Ltd 已于1月30日获得该国FCA的批准 B2C2将提供电子场外交易 OTC 可以向合格交易方和专业客户提供差价合
  • CUDA——SM中warp调度器调度机制&&访存延迟隐藏

    SM中warp调度器调度机制 访存延迟隐藏 核函数中并不是所有线程一起启动执行的 核函数的执行是以线程束 warps 作为单位 warps的执行由warp调度器进行调度 一个调度器只能调度一个warp去执行指令 一个warp里的所有线程几乎