自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(334)
  • 资源 (1)
  • 收藏
  • 关注

原创 cuda编程 --------- warp 级别规约指令 __shfl_xor_sync

_shfl_xor_sync 是 CUDA 中的一种 warp 级别洗牌指令(shuffle instruction),用于在 warp 内的线程之间交换数据。它允许线程直接读取同一 warp 中另一个线程的寄存器值,而无需通过共享内存或全局内存。这样可以实现高效的线程间通信,并减少共享内存的使用。具体来说,__shfl_xor_sync 通过按位异或(XOR)操作来确定目标线程的索引。每个线程都可以从与自身线程索引按位异或一个特定值(称为掩码)的线程中获取数据。

2025-12-07 19:42:22 33

原创 征机器人领域主流模型量化,评测,优化,部署工具model_optimizer的开源合作开发

在thor上测试,fp8/entroy量化下模型精度损失很小,可以满足生产要求。希望有对机器人模型感兴趣的一起共建。也可以通过项目交流机器人行业动态。模型的in8/fp8, amax/entroy量化.简化机器人领域模型的量化,评测,优化,部署流程。的量化评测与优化部署。

2025-11-29 10:16:07 140

原创 CUDA性能优化 ---- 通过矢量化内存访问提高性能

使用矢量化加载可以减少指令总数,降低延迟,并提高带宽利用率.使用矢量化加载的最简单方法是使用CUDA C++标准头文件中定义的矢量数据类型,如int2、int4或float2、float4.这些类型表示打包在一个数据单元中的多个值。您可以通过C++中的类型转换轻松使用这些类型.例如,在C++中,你可以使用reinterpret_cast<int2*>(d_in)将int指针d_in重写为int2指针,该指针将一对“int”值视为一个单元。您还可以使用结构生成矢量化加载,只要该结构的大小是两个字节的幂。

2025-09-20 21:06:46 279

原创 评估训练模型所需的算力

10亿参数模型:需约1-10 PetaFLOP/s-days(等效1万亿次浮点运算持续1天)千亿参数(如GPT-3):约3,000-5,000 PetaFLOP/s-days万亿参数模型:超过50,000 PetaFLOP/s-days。

2025-01-29 15:17:48 1304

原创 了解cuda的统一内存

在CUDA 6中,从Kepler GPU架构(计算能力3.0或更高)开始,在64位Windows 7、8和Linux操作系统(内核2.6.18+)上开始支持统一内存.从CUDA 6开始,NVIDIA推出了CUDA平台历史上最引人注目的编程模型改进之一 ----统一内存。在当今典型的PC或集群节点中,CPU和GPU的内存在物理上是不同的,并由PCI Express总线分隔。在CUDA 6之前,程序员必须这样看待事物。CPU和GPU之间共享的数据必须在两个内存中分配,并由程序在它们之间明确复制。

2024-12-21 18:51:37 969

原创 gpu硬件架构

NVIDIA在视觉计算和人工智能(AI)领域处于领先地位;其旗舰GPU已成为解决包括高性能计算和人工智能在内的各个领域复杂计算挑战所不可或缺的。虽然它们的规格经常被讨论,但很难掌握各种组件的清晰完整的图景。这些GPU的高性能源于其许多组件的无缝集成,每个组件在提供顶级结果方面都发挥着至关重要的作用。本篇文章将对NVIDIA GPU的每个组件进行详细的介绍,从架构和图形处理集群(GPC)到单个核心。另外还有确保高效数据访问的复杂内存层次结构。

2024-12-14 23:28:04 1190

原创 深入理解linux内核 --------- CFS调度

else通过上面的代码,可以看到调度周期的时间长度分2种情况。如果当前可运行的任务数>8,则用最小运行时间(0.75ms)*可运行的任务数sysctl_sched_min_granularity: //为了减少任务切换,最小的运行时间片0.75ms.如果运行队列上的任务数

2024-08-28 20:36:14 1400 1

原创 BPF可移植性 CO-RE (Compile Once – Run Everywhere)

BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。

2024-07-01 16:35:05 287

原创 BPF可移植性 CO-RE (Compile Once – Run Everywhere)

BPF CO-RE的目标是帮助BPF开发人员以简单的方式解决简单的可移植性问题(如读取结构字段),并使其仍然有可能(如果不是微不足道的话,也是可以容忍的)解决复杂的可移植问题(如不兼容的数据结构更改、复杂的用户空间控制条件等)。这允许BPF开发人员停留在“编译一次–到处运行”的范式中。这是通过组合几个BPF CO-RE构建块来实现的,如本篇文章的内容所述:vmlinux.h消除内核头文件依赖字段重定位(字段偏移、存在、大小等)使从内核提取数据变得可移植。

2024-07-01 16:30:45 318

原创 deepE 定位系统卡顿问题实战(一) ----------- 锁造成的阻塞问题

我们可以利用这个offcputime来分析实际环境中因为各种原因造成的进程阻塞及卡顿问题.

2024-06-28 15:13:22 446

原创 堆栈推导两种方式fp与dwarf的差异与原理解析

堆栈推导一般用于coredump文件分析,火焰图制作等场景.了解其原理,有助于帮助我们分析异常问题,以及优化火焰图的制作流程,减少不完整栈情况的出现.堆栈推导有两种常见方式:fp与dwarf. 本篇文章介绍这2种堆栈推导方式的原理及适用场景.

2024-06-28 10:56:54 459

原创 deepE版本支持aarhc64 orin平台发布

欢迎参与deepE项目。

2024-06-25 11:18:24 176

原创 deepE第一个版本发布了

deepE(deep edge): 是一个用于端侧(自动驾驶车、机器人等)的性能监控和分析工具.deepE的理念是高效地对端侧系统提供全面的可观测性和系统分析工具,让端侧系统高效稳定的运行.

2024-06-11 16:27:24 637

原创 chatgpt4和文心一言的简单对比

文心一言给出了分析udp延迟的步骤比较具体(数据包达到和应用程序读取之间的时间差)chatgpt4给出的原理更加抽象,需要记录期望的2个时间点间的时间差,适用范围明显更广.

2024-06-02 20:05:54 2364 1

原创 linux可观测性ebpf(一) ----------- 环境搭建

因为学习的书比较老,所以libbpf我们要使用v.8.0.0版本。

2024-06-01 10:04:56 405

原创 linux i/o基本原理

linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。

2024-05-23 10:19:34 220

原创 每天一个ebpf工具 io篇(一) ----------- biosnoop

这里的延迟是1.1中, 2和3操作之间的延迟。即从内核将i/o操作提交给块设备到块设备完成操作通知内核软中断处理的耗时.linux对每个磁盘或分区都维护有一个请求队列,i/o算法会进行操作的合并重排等操作以优化性能。i/o结束时,分别统计i/o请求在队列中的等待时间和i/o操作块设备的延迟时间.显示进行i/o操作的程序,操作的磁盘扇区,读/写操作, 字节数,以及延迟。获取当前放入i/o request_queue的时间,并放入map中。获取当前提交块设备i/o请求的时间,并放入map中。

2024-05-22 14:35:04 422

原创 perfetto原理之ProtoZero

ProtoZero是一个零拷贝,零分配,零系统调用的protobuf序列化库,主要用于在Perfetto里实现跟踪记录.

2024-04-07 11:35:43 369

原创 ebpf+perfetto实现调度延迟记录与展示

因此,我们只需在2.1.1时记录线程的tid和时间, 在2.1.2时根据tid取出2.1.1时记录的时间并与当前时间做差值,即可得到调度延迟.然后我们用bcc前端结合上面的ebpf程序实现延迟数据获取并记录perfetto支持的json的代码.perfetto支持proto与json等多种格式,为了简化我们的实现难度,我们使用json格式.这里我们只需要研究一下perfetto的数据格式,并按照其格式存储即可.我们可以跟踪线程从放入就绪队列到实际被选中并获得CPU的过程。这里要注意,我们检测系统是否支持。

2024-04-05 22:47:46 807

原创 使用ebpf优化FastDDS统计模块statistics

概述通过本文,你将了解到以下内容:fastdds的调试统计功能如何使用fastdds的调试统计功能有什么问题如何使用USDT(systemTap) + ebpf对fastdds调试统计功能进行改造,以实现动态开关调试功能并实现高性能.fastdds statistics官方文档及说明https://fast-dds.docs.eprosima.com/en/latest/fastdds/statistics/statistics.html已知bughttps://fast-dds.do

2024-04-03 19:17:00 498

原创 ROS2性能优化(一) ------------- 优化executor性能

使用ros2实现的节点,订阅了较多的topic数量(70个左右), 节点cpu使用率明显升高使用perf观察火焰图,executor耗时较多.在ros2 rclcpp的github上搜到确实有一个相关的issue.

2024-03-24 10:29:21 1095

原创 网络优化篇(一)---------TCP重传性能优化

本文通过一个TCP重传优化的实际问题,详细讲解问题的分析、定位、优化过程。/procbcc。

2024-01-06 21:11:54 1818

原创 bcc实战(一)---------内存性能优化

其实我们可以针对不同类型的问题,制作相应的火焰图。因为不同cpu上linux处理page_fault的入口可能不同,所以我们先用bpftrace工具查找一下对应的函数。使用TCMalloc后可以使用火焰图和pidstat再次确认内存使用情况。如果改头善不明显,可能要针对里程内存的使用特点,对TCMalloc进行参数调整或者使用其它内存分配器。可以看到进程每秒的page_fault次数有几万次,数量还是很高的,有很大优化空间.使用TCMalloc让进程尽可能的缓存使用的物理内存,而不是频繁的交还操作系统。

2024-01-05 11:29:08 634

原创 epbf原理篇 -------- epbf编程语言

1.6万字bpf正如上文中提到Linus对epbf的评价ebpf的强大的可编程性几乎可以最大程度地的满足我们性能分析、追踪、安全等各种需要。既然类似于一门编程语言,我们就可以从学习一门编程语言的角度来学习它。看看ebpf都提供给我们哪些编程便利.

2023-12-31 09:33:57 1585

原创 ebpf基础篇(二) ----- ebpf前世今生

它提供了数据链路层的接口,可以在数据链路层发送和接收数据.如果网卡支持混杂模式,所有的数据包都可以被接收,即使这些数据包的目的地址是其它主机.安全是因为ebpf程序需要经过内核中验证器的验证,它可以进行静态代码分析,拒绝可能crash,hang或者对内核有负作用的代码.这些过滤指令实际上是由内核中运行的虚拟机执行的,这个内核中的虚拟机就是BPF的实现核心.这种验证模式和沙箱机器不同,沙箱的运行环境是有限制的,且对执行的程序没有了解能力.,程序可以关联到内核的多种hooks,并在事件触发时运行.

2023-12-24 19:01:17 1249

原创 性能实战(一) --- clock_gettime造成系统整体cpu过高定位过程

既然clock_gettime可以通过vdso,为什么异常系统上还会有这么多系统调用呢?

2023-12-23 21:46:15 2331

原创 ebpf基础篇(一) -------- hello ebpf

很多东西的学习都开始于一个’hello world’, ebpf也不例外。实验环境: ubuntu 20.04。

2023-12-23 11:30:41 630

原创 Linux NAPI ------------- epoll边缘触发模式

表示与轮询表中其他设备相比,该设备的相对重要性。网络驱动程序对特定于设备的中断设置了一个处理例程,因此每当该中断被引发时(即分组到达),内核都调用该处理程序,将数据从网卡传输到物理内存,或通知内核在一定时间后进行处理。由于下一个分组也通过IRQ通知,如果前一个分组的IRQ尚未处理完成,则会导致问题,高速设备通常就是这样。在从 napi_struct 的容器获得特定于设备的信息之后,调用一个特定于硬件的方法(这里是。么不利之处:在没有分组还需要处理时,将停止轮询,设备将回复到通常的IRQ驱动的运行方式。

2023-12-15 12:10:10 1179

原创 Linux PSI-----Pressure Stall information

当CPU、memory或IO设备处于竞争状态,业务负载会遭受时延毛刺、吞吐量降低,及面临OOM的风险。如果没有一种准确的方法度量系统竞争程度,则有两种后果:一种是用户过于节制,未充分利用系统资源;另一种是过度使用,经常性面临业务中断的风险。psi特性能够识别和量化资源竞争导致的业务中断,及其对复杂负载乃至整个系统在时间上的影响。准确度量因资源不足造成的生产力损失,有助于用户基于硬件调整业务负载,或基于业务负载配置硬件。

2023-12-10 10:33:27 1639

原创 定位分析RCU stall问题

在编译内核时打开或者在启动参数中增加这样统计信息是在采样周期中收集的。其中number行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数cputime行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.

2023-12-09 21:47:47 1852

原创 ebpf实战(一)-------监控udp延迟

然后在流程2读取udp缓冲区时(__skb_recv_udp)时取出1中记录的skb时间,并与当前时间做差值得到延迟.为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段.2和1之间可能由于调度等造成延迟,我们写一个bcc程序对指定接收端口和延迟大于某个值的情况进行监控。我们在流程1放入udp缓冲区时(udp_unicast_rcv_skb),记录此skb的时间。1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区。

2023-11-23 14:30:57 1077

原创 fastdds实战 ------ 订阅者使用组播

使用"default_external_unicast_locators"置空关闭默认的单播udp端口。默认情况下,FastDDS会对本机的topic使用共享内存,并默认开启一个单播udp端口接收数据.因此我们使用"useBuiltinTransports=false"关闭默认的共享内存通道。并配置一个组播地址用于接收数据,并通过代码在创建data_reader时使用它.

2023-11-23 10:22:19 718

原创 模板元编程实例---如何设计通用的几何库

模板元编程实例—如何设计通用的几何库设计原理假设你需要使用c++程序来计算两点间的距离.你可能会这样做:先定义一个struct:struct mypoint{ double x, y;};然后定义一个包含计算算法的函数:double distance(mypoint const& a, mypoint const& b){ double dx = a.x - b.x; double dy = a.y - b.y; return sq

2022-02-27 11:57:09 892

原创 BPF性能分析—内存篇page_fault

性能分析—内存篇page_fault分析步骤1.sar -B 1整体分析,重点关注fault/s# sar -B 1Linux 5.4.0-92-generic (zhangxa-Precision-3650-Tower-docker) 01/17/22 _x86_64_ (16 CPU)11:35:37 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff

2022-01-21 21:47:52 1527

原创 libco开发教程(一) ---- 第一个测试用例

libco开发教程(一) ---- 第一个例子libco背景关于libco的背景,可以看我之前的文章,在c中实现协程前一段时间一直在忙换工作的事情,因此c语言协程库的开发有一些搁浅.最近换工作的事情告一段落了,代码实现也就提上了日程.感兴趣的小伙伴可以跟着我的教程一步一步实践,最终实现一个功能完善能够在生产中使用的c协程库.TDD项目以TDD测试驱动开发的方式进行编码,我们先来编写一个最简单的测试用例test case#include "gtest/gtest.h"#include "

2021-09-22 15:51:36 538

原创 gRPC详解-----负载均衡策略

1. 背景1.1 基于调用的LB需要注意的是,gRPC的负载均衡是基于每次调用而不是每条连接的.换句话说,即使所有的请求来自同一个客户端,我们也希望这些请求能够在不同的服务上进行LB.1.2 LB的实现方法在介绍任何gRPC的特定实现之前,我们先来浏览一下常见的LB实现方式.balancing.1.2.1 代理模式使用代理能够提供可靠可信任的客户端,还可以向LB系统报告负载情况.代理通常需要更多的资源和操作,因为代理需要拷贝RPC请求和响应的副本.这种模式也会增加RPC的延迟.当请求量很

2021-08-07 20:52:31 2020

原创 golang抢占实现(一)----------抢占的时机

golang抢占时机golang 1.14版本以后开始支持抢占协程.这里有个有趣的问题是:用户态调度的goroutine在什么时机触发抢占判断?熟悉linux的朋友可能知道,linux可能的抢占时机有:时钟中断处理里系统调用返回golang目前的实现golang编译器在每个函数调用之前都会插入以下代码: mov %fs:0xfffffffffffffff8,%rcx //获取tls cmp 0x10(%rcx),%rsp // 判断当前协程的stack是否足够

2021-07-14 23:48:34 697

原创 golang程序启动流程详解

golang程序启动流程详解环境go1.16.5 linux/amd64用例package mainimport "fmt"func main() { fmt.Println(42)}编译-gcflags “-N -l”: 关闭优化和内联,方便调试跟踪$ go build -gcflags "-N -l" -o hello hello.go gdb跟踪执行流程$ gdb hello$ source /usr/lib/go/src/runtime/runti

2021-07-10 20:35:22 2056

原创 在C语言中实现协程库(一)----------协程切换原理详解

从这篇文章开始,我将一点一点详细介绍如何在c语言中实现协程库.并对其中涉及到的技术进行详细的解释.感兴趣的小伙伴欢迎一起参与代码地址协程切换原理使用glibc中<ucontext.h>提供的相关函数用户态切换简单来说就是保存当前上下文,切换到新的上下文.用户态程序的上下文一般包含如下信息:栈各种寄存器信号掩码: linux信号掩码是基于线程的,协程也需要支持单独设置信号掩码信息我们来看一下glibc定义的用户态上下文结构ucontext_t:typedef struct

2021-07-04 21:46:17 1642 14

原创 自己如何实现自旋锁,互斥锁和读写锁

锁C语言协程库实现锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价.自旋锁自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直到获取到锁而不会让出控制权.自旋锁的特点也使其只能用于保护操作较短的临界区,且不能睡眠.代码实现主要是通过cas等原子操作来模拟.typedef volatile spin_lock_t;spin_lock(spin_lock_t *lock){ do { if (cas(

2021-06-27 19:46:03 645

openstack资料

openstack相关资料

2017-01-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除