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><…...
AI编码助手选型与实战:从Awesome List到高效开发工作流
1. 项目概述:一个AI编码时代的“藏宝图”如果你最近也在关注AI如何改变编程这件事,那你大概率已经听过“AI编码助手”或者“AI结对编程”这些词了。从GitHub Copilot到各种开源的代码生成模型,工具层出不穷,但问题也随之而来&…...
智能体开发爆发期!程序员现在转型,还能赶上红利吗?
文章目录 前言一、为什么2026年是智能体开发的爆发元年?1.1 市场数据说话:万亿级赛道正在加速形成1.2 企业需求爆发:从"要不要做"到"怎么做"1.3 薪资差距拉大:同样3年经验,薪资差一倍 二、90%程序…...
【2026最新】英文论文降AIGC实测:拒绝盲目换词,工具盘点与3种手动修改方法
马上要临近答辩了,还有的同学在发愁英文摘要和全英文章怎么降低aigc率。英文文本的句式本来就很固定,比如大量的被动语态和从句,这就很容易被系统标记,尤其对于我们这种非英语母语者来说,更是无从下手。 今天我就结合…...
Vue.js数据同步利器:vsync库的核心原理与工程实践
1. 项目概述:一个基于Vue.js的现代化同步解决方案最近在梳理前端状态管理和数据同步的实践时,我遇到了一个挺有意思的开源项目:Hardik455abc/vsync。乍一看这个标题,vsync很容易让人联想到计算机图形学里的“垂直同步”࿰…...
ARM GICv3虚拟中断控制器架构与ICH_LR寄存器解析
1. ARM GICv3虚拟中断控制器架构概述在ARMv8-A架构的虚拟化环境中,中断控制器的虚拟化是实现高效虚拟机隔离和实时响应的关键技术。GICv3作为第三代通用中断控制器,通过引入虚拟化扩展(Virtualization Extensions)为每个虚拟CPU(vCPU)提供了完整的虚拟中…...
本地搭建React Server Components:从原理到实践深度解析
1. 项目概述:当Server Components从概念走向你的本地环境如果你最近关注前端技术动态,一定对“Server Components”这个词不陌生。它被描述为React生态的一次范式转移,承诺带来更小的客户端包体积、更直接的数据库访问和更快的首屏渲染。但说…...
三步解锁Chrome浏览器中的Markdown阅读新体验
三步解锁Chrome浏览器中的Markdown阅读新体验 【免费下载链接】markdownReader markdownReader is a extention for chrome, used for reading markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownReader 在Chrome浏览器中直接打开Markdown文件时&…...
5分钟搞定网页视频下载:VideoDownloadHelper免费插件终极指南
5分钟搞定网页视频下载:VideoDownloadHelper免费插件终极指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常遇到这样…...
AntiDupl.NET:免费开源图片去重工具完整使用指南
AntiDupl.NET:免费开源图片去重工具完整使用指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾在整理照片库时发现大量重复图片,却不…...
通过 Taotoken CLI 工具一键配置开发环境中的多工具 API 端点
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 Taotoken CLI 工具一键配置开发环境中的多工具 API 端点 在接入多个大模型服务时,开发者常常需要为不同的工具和 …...
