CUDA系列-Kernel Launch-8
这里写目录标题
- kernel launch
本章主要追踪一下kernel launch的流程,会不断完善。
kernel launch
先抛出一个问题,如果在一个循环中不断的发送kernel(kernel 内部while死循环),会是什么结果。
// kernel 函数
__global__ void kernel(float *a, int n) {int id = threadIdx.x + blockIdx.x * blockDim.x;while(1) {//a[id] = sqrt(a[id] + 1);//这句注释掉对结果没有影响}
}// 持续不断的把kernelfun送入某一个具体stream
int main() {
//1. 声明变量(略)//2. 设置cudaLimitDevRuntimePendingLaunchCount为128/1000等cudaDeviceSetLimit(cudaLimitDevRuntimePendingLaunchCount, 128);//3. 创建stream
StreamCreate(&stream);//4. launch kernel ctrl+C 退出while (1) {
//grid_dim, block_dim一次性占满所有资源或者<<<1,1>>>kernel<<<grid_dim, block_dim, 0, stream>>>(buffer, size);}
...
//5. 销毁资源sync();StreamDestroy(&stream1);
}上面3,4,5可以改为多线程,一个线程一个stream.
其中还有一个简单的办法,首先在stream中发射一个阻塞的hostfun,然后发送空kernel也能计算到其大小,参考部分有相关代码
结果:
持续的发送一个小kernel到1个stream中,在1022次kernal launch 后,host出现block。3个stream中现象和1个stream一样,也是在1022次后被阻塞住。
详细参数如下(无论cudaLimitDevRuntimePendingLaunchCount设置为多少,下面结果没有变化)
index | griddim | blockdim | strem | result |
---|---|---|---|---|
1 | 1 | 1 | 1 | 从1022次开始阻塞 |
2 | 1 | 1 | 3 | 从1022次开始阻塞 |
3 | 1728 | 128 | 1 | 从1022次开始阻塞 |
4 | 1728 | 128 | 3 | 从1022次开始阻塞 |
6 | 1728 | 128 | 8 | 从1022次开始阻塞 |
7 | 1/1728 | 1/128 | 12 | 约~743次开始阻塞 |
8 | 1/1728 | 1/128 | 16 | 约~550次开始阻塞 |
9 | 1/1728 | 1/128 | 48 | 约~224次开始阻塞 |
10 | 1/1728 | 1/128 | 128 | 约~12-33次开始阻塞 |
- cudaLimitDevRuntimePendingLaunchCount 的设置对结果没有影响,上面表格中,cudaLimitDevRuntimePendingLaunchCount无论设置为128,256,1000等,最后结果都是一样的。因为它是CUDA Dynamic Parallelism 嵌套launch的一个控制参数(后面会有证明)。
2)grid_dim, block_dim大小对结果也没有影响,因为此刻限制issue item的数量的是cuda runtimes 中的stream queue(实际上该queue 被map到另外一个叫做channel的对象上),对于正在执行或者pending状态的item,都会在queue中占用资源,直到其完成。上面都说明限制在某个stream上launch kernel的瓶颈点是一个host端侧的资源,所以排除cudaLimitDevRuntimePendingLaunchCount,因为它是一个device侧的资源控制量。
3)stream用户可以创建很多个,但是stream queue最后都是被map到channel上,channel的数量是有限的,并且channel又分为很多类型,不同类型其capacity也不一样,其中看实验结果,其中CU_CHANNEL_COMPUTE类型的只有8个,并且每个channel容纳1022个kernel func。
- 如果stream数量少于channel的数量,那么每个stream对应一个channel,如果stream的数量大于channel,distributes work evenly across all channels。
cuiLaunchstreamBeginPushWithFlagsstreamBeginPushWithDescstreamBeginPushOnChannelWithFlagschannelBeginPushInternalchannelBeginPushInternal_UnderLockchannelMustAdvance_UnderlockchannelMustAdvance_WaitForGPFIFOchannelCanAdvanceGPFIFO(在这里判断pushbuf和fifo entry)gpfifoHasPushbufferSpacegpfifoAdvanceGpuGetpushbufferHasSpace
整个调用链是这样的:
当向stream中下发kerneL的时候,stream会找到一个channel,该channel中有一个gpfifo的queue,其内部有一个ring_buffer(4M),另外还维护着一个semaphore queue(Max:1024),我们下发的每个kernel都会写道对应的ring_buffer中,并且每个kernel对专门对应一个semaphore entry放在semaphore queue中,当GPU开始执行kernel的时候,ring_buffer中的kernel data是不能删除的,只有当kernel执行完后,GPU 发送一个semaphore signal给CPU,CPU收到后会找对应的semaphore entry,让其释放资源,因为fifo有顺序要求,所以如果前面的kernel没有执行完,后面的kernel执行完,那么依然会block.也就是说只要第一个kernel在执行,即使后面全部是empty kernel 那么依然会block.
(继续完善)
相关文章:
CUDA系列-Kernel Launch-8
这里写目录标题 kernel launch 本章主要追踪一下kernel launch的流程,会不断完善。 kernel launch 先抛出一个问题,如果在一个循环中不断的发送kernel(kernel 内部while死循环),会是什么结果。 // kernel 函数 __glo…...

# 消息中间件 RocketMQ 高级功能和源码分析(四)
消息中间件 RocketMQ 高级功能和源码分析(四) 一、 消息中间件 RocketMQ 源码分析:回顾 NameServer 架构设计。 1、RocketMQ 架构设计 消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer&…...

如何通过数据库与AI实现以图搜图?OceanBase向量功能详解
OceanBase支持向量数据库的基础能力 当前,数据库存储系统与人工智能技术的结合,可以体现在两个主要的应用方向上。 一、近似搜索。它利用大语言模型(LLM,简称大模型)的嵌入(embedding)技术&am…...
Kafka内外网分流配置listeners和advertised.listeners
问题背景: Kafka部署在内网,内网Java服务会使用Kafka收发消息,另外,Java服务会与其他第三方系统使用kafka实现数据同步,也就是外网也会发送消息到kafka,外网IP做了端口映射到了内网,advertised…...

Linux系统编程——网络编程
目录 一、对于Socket、TCP/UDP、端口号的认知: 1.1 什么是Socket: 1.2 TCP/UDP对比: 1.3 端口号的作用: 二、字节序 2.1 字节序相关概念: 2.2 为什么会有字节序: 2.3 主机字节序转换成网络字节序函数…...
信息安全技术基础知识-经典题目
【第1题】 1.在信息安全领域,基本的安全性原则包括机密性(Confidentiality)、完整性(Integrity)和 可用性(Availability)。机密性指保护信息在使用、传输和存储时 (1) 。信息加密是保证系统机密性的常用手段。使用哈希校验是保证数据完整性的常用方法。可用性指保证…...

nextjs(持续学习中)
return ( <p className{${lusitana.className} text-xl text-gray-800 md:text-3xl md:leading-normal}> Welcome to Acme. This is the example for the{’ } Next.js Learn Course , brought to you by Vercel. ); } 在顶级 /public 文件夹下提供静态资产 **默认 /…...
数据预处理与特征工程、过拟合与欠拟合
数据预处理与特征工程 常用的数据预处理步骤 向量化:将数据转换成pytorch张量值归一化:将特定特征的数据表示成均值为0,标准差为1的数据的过程;取较小的值:通常在0和1之间;相同值域处理缺失值特征工程&am…...
甲辰年五月十四风雨思
甲辰年五月十四风雨思 夜雨消暑气,远光归家心。 只待万窗明,朝夕千家勤。 苦乐言行得,酸甜日常品。 宫商角徵羽,仁义礼智信。...
java分别使用 iText 7 库和iText 5 库 将excel转成PDF导出,以及如何对excel转PDF合并单元格
第一种 package com.junfun.pms.report.util;import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.property.TextAlignment; import com.itextpdf.layout.prop…...

Java特性之设计模式【访问者模式】
一、访问者模式 概述 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式&…...
【教师资格证考试综合素质——法律专项】未成年人保护法笔记以及练习题
《中华人民共和国未成年人保护法》 目录 第一章 总 则 第二章 家庭保护 第三章 学校保护 第四章 社会保护 第五章 网络保护 第六章 政府保护 第七章 司法保护 第八章 法律责任 第九章 附 则 介一.首次颁布:第一部《中华人民共和国未成年人保护法…...
6.19作业
TCP服务器 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h>#define PORT 8888 #define IP "192.168.124.39&q…...

java 线程之间通信-volatile 和 synchronized
你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…...

资源宝库网站!人人必备的神器!
面对网络中海量的内容,一个高效、便捷的网络导航工具,可以帮助我们快速查找使用网络资源。无论是职场精英还是学生党,使用导航网站都可以帮助我们提升效率。下面小编就来和大家分享一款资源宝库网站-办公人导航-实用的办公生活导航网站&#…...

Redis实战—优惠卷秒杀(锁/事务/代理对象的应用)
本博客为个人学习笔记,学习网站与详细见:黑马程序员Redis入门到实战 P50 - P54 目录 优惠卷秒杀下单功能实现 超卖问题 悲观锁与乐观锁 实现CAS法乐观锁 一人一单功能实现 代码优化 代码细节分析 优惠卷秒杀下单功能实现 Controller层…...

HTML星空特效
目录 写在前面 完整代码 代码分析 运行效果 系列文章 写在后面 写在前面 100行代码实现HTML星空特效。 完整代码 全部代码如下。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&g…...

银行数仓项目实战(四)--了解银行业务(存款)
文章目录 项目准备存款活期定期整存整取零存整取存本取息教育储蓄定活两便通知存款 对公存款对公账户协议存款 利率 项目准备 (贴源层不必写到项目文档,因为没啥操作没啥技术,只是数据。) 可以看到,银行的贴源层并不紧…...

MySQL版本发布模型
MySQL 8.0 之后使用了新的版本控制和发布模型,分为两个主线:长期支持版(LTS)以及创新版。这两种版本都包含了缺陷修复和安全修复,都可以用于生产环境。 下图是 MySQL 的版本发布计划: 长期支持版 MySQL…...
java: 不兼容的类型: org.apache.xmlbeans.XmlObject无法转换为x2006.main.CTRow
我使用的xmlbeans版本是5.0,使用xmlbeans包做转换时,报错,正如标题显示得那样 解决办法 额外再引入下面的jar包 <dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...