- 博客(111)
- 收藏
- 关注
原创 conda极速上手记录
Conda是一个跨平台的包管理工具和环境管理系统,支持Python、R、Java等多种语言。它能解决不同项目间的依赖冲突问题,例如:项目A需要Python 3.6 + NumPy 1.18;项目B需要Python 3.10 + NumPy 2.0。通过创建独立环境,Conda可隔离不同版本的包和Python解释器。
2025-03-26 10:31:34
510
原创 NCCL学习-集合通信思路梳理
3.根据ID,UniqueId等,完成NCCL通信器初始化(ncclCommInitRankDev :确保NCCL初始化,确保CUDA初始化,配置NCCL通信器的一些属性,分配一个作业对象,异步启动ncclCommInitRankFunc函数看有没有父通信器)这个包含了rank0的网络地址),获得ncclUniqueId中包含的rank0的网络地址,每个rank上都有rank0的网络地址。1.初始化MPI通信(MPICHECK一下),通过MPI获取本机rank数量localrank,rank绑定GPU。
2025-01-09 14:37:28
468
原创 NCCL学习笔记-总结示例代码
班长一次性给所有同学布置任务(ncclGroupStart 和 ncclGroupEnd),然后等所有同学完成任务(cudaStreamSynchronize)。适用于每个 GPU 独立工作的场景,比如多节点训练,每个节点有一个 GPU。适用于一个节点有多个 GPU 的场景,比如单节点多 GPU 训练。一个线程管多个 GPU,就像一个班长管多个同学。每个进程或线程只管理一个 GPU 设备。: 每个进程/线程管理一个 GPU。一个线程管理多个 GPU 设备。: 一个线程管理多个 GPU。
2025-01-08 14:46:15
367
原创 NCCL学习笔记-代码解析
ncclAllReduce是NCCL中的一个集合通信操作,它将所有设备的发送缓冲区中的数据求和,并将结果存储到每个设备的接收缓冲区中。使用CUDACHECK和NCCLCHECK宏来捕获和处理CUDA和NCCL API调用中的错误。ncclCommInitAll用于初始化NCCL通信器,使得多个设备之间可以进行通信。代码首先初始化了CUDA和NCCL环境,并为每个设备分配了内存和CUDA流。最后,代码释放了设备上的内存,并销毁了NCCL通信器。完整工作案例(单进程多设备)
2025-01-08 12:01:16
818
原创 NCCL学习笔记-函数解析
1.NCCL 是一个专注于 GPU 间高性能通信的库,不提供进程管理或安全通信功能。2.用户需要依赖应用程序的进程管理系统(如 MPI)来管理进程,并确保 NCCL 在安全的网络环境中运行。3.通过正确配置环境变量(如),用户可以优化 NCCL 的网络通信性能。
2025-01-08 10:32:31
400
原创 NCCL学习笔记-安装验证
安装后将 NCCL 的库路径添加到 LD_LIBRARY_PATH(Linux)中。如果输出为 True,则说明 NCCL 已成功安装并与 PyTorch 集成。
2025-01-07 15:23:30
342
原创 NCCL学习笔记-概念全解
因为二叉树大约一半节点都是叶子节点,那么通过将叶子节点变换为非叶子节点,得到两棵二叉树,每个节点在其中好一棵二叉树是叶子节点,另一棵二叉树是非叶子节点。建立包含GPU的XML树结构,可以设置环境变量NCCL_TOPO_DUMP_FILE来书输出XML文件,并通过该XML文件来查看机器的拓扑结构。所以需要一个针对GPU架构优化,支持NVLink,NVSwitch的高速互联。通用通信库在GPU通信中性能不足,无法充分利用GPU高带宽和低延迟。NCCL 2.0:支持多机多卡通信,引入跨节点通信功能。
2025-01-07 15:03:34
455
原创 NCCL学习笔记-拓扑和算法
专为NVIDIA GPU设计的通信库优化了通过NVLink进行的GPU间通信绕过传统CPU中转,而是GPU之间直接通信CUDA的基层,CUDA程序中无缝使用NCCL自适应拓扑:不管单节点多GPU还是多节点多GPU,自动检测。
2025-01-07 14:37:51
2140
原创 NCCL学习笔记-并行策略
它的核心思想是将一个大模型拆分成多个小模型(称为“专家”),每个专家专门处理输入数据的一部分,然后通过一个“路由机制”来决定哪些专家应该处理哪些数据。Backward Pass:同样通过 all-gather 将模型参数聚集到每个 GPU,计算出本地梯度后,通过 reduce-scatter 将平均后的梯度分摊到各自的 GPU 上,然后进行本地的权重更新。MoE的好处是,它不需要所有的专家都参与每一个任务,而是只调用最相关的专家,这样既高效又灵活,特别适合处理大规模和复杂的任务。
2025-01-07 10:41:10
585
原创 自己实现栈-实现队列
1.栈有push和pop接口,但是不提供走访的功能,不提供迭代器(类似于set和map的迭代器是没有的),所以栈是有个容器完成工作,容器无所谓。所以栈不是容器,而是容器适配器。STL中的栈用的是数组和链表都可以。3.SGI STL用的默认是deque为容器的栈,双向队列实现栈,只要封住一端,另一端打通,就是栈的逻辑了。2.常用的是SGI STL 这也是GCC编译器采用的STL。2.我们使用的stack是属于哪个版本的STL?对于队列也是一样的。3.我们使用的STL中stack是如何实现的?
2024-12-06 17:27:01
291
原创 Go-mall Frontend设计
tmpl(通常是模板文件 template 的缩写)是一种用于定义模板的文件格式。它主要包含了带有占位符或模板指令的文本内容,这些占位符和指令用于在运行时被具体的数据替换或者执行,从而生成最终完整的输出,如动态网页、配置文件等。比较重要的是biz和template和static(对于前端)有css js 和要用到的image。再看看static里面有什么。
2024-12-05 16:09:43
161
原创 Go热加载工具air-使用说明-win11问题解决指南
地址:https://github.com/air-verse/air。windows老是不是批处理什么什么的报错。弄下这两个 解决了 air -v看看。go版本>=1.23。
2024-12-04 11:09:12
311
原创 Go-protobuf consul注册备忘录
想要运行就可以 前提是port要改对 windows必须是现在的ip地址+8888端口才可以成功注册到consul。client在\demo\demo_proto\cmd\client里面 也是用go run .来运行。consul的地址是localhost:8500。demo/demo_proto是server。
2024-11-24 14:47:06
367
原创 Go-企业级网络层
租赁外网ip–将域名解析到外网ip上,绑定到物理机,发布公网route,用于外部用户访问。然后配置/etc/resolv.conf中nameservers为公共DNS。非对称加密:两个不同的密钥,公钥加密只有私钥能解密,私钥解密只能公钥能解密。对称加密:一份密钥(双方使用相同的)但是传输密钥的过程有可能被截获。自建DNS服务器就可以解决了,外部用户也看不到内网ip了。开源的DNS:bind nsd knot coredns。域名是需要购买的 还得购买二级域名。然后可以清空/etc/hosts了。
2024-11-22 17:19:55
222
原创 Go-RPC关键指标分析与企业实践
合并部署:微服务太微了,传输和序列化开销越来越大。易用性:开箱即用 周边工具 支持protobuf和thrift 生成服务代码脚手架。扩展性:Middleware-option-编解码层-协议层-网络传输层-插件扩展。交互方式:ping-pong/streaming/oneway。观测性:Log Metric Tracing 内置观测性服务。2.稳定性-请求成功率(用重复发送 负载均衡)编解码:thrift/protobuf。3.稳定性-长尾请求(用备份请求)调度优化:重用goroutine。
2024-11-19 16:16:57
445
原创 Go-RPC框架分层设计
了 不同的服务可以用不同的语言进行开发 比如视频-直播-商城-通知-支付等等。而现在谈的Thrift用的编码是TLV编码 tag-length-value。3.编解码:也叫序列化与反序列化 从内存中表示–>字节序列 这就是一次编码。(映射到正确的函数 要付款而不是退款 每个函数得有自己的ID 才能找到)文件 然后生成不同语言的CodeGen(Golang C++ Java)在这个编解码层:有数据格式:语言特定的格式-文本格式-二进制编码。2.生成代码:通过编译器工具把IDL文件转换为语言对应的静态库。
2024-11-15 16:03:27
540
原创 Go-一文打尽基础语法实例
解释range:for循环中迭代array slice channel map的用的东西。切片类似于array,也可以用下标访问。17-JSON 有序列化与反序列化。当然,容量可以不传,默认和长度相等。
2024-11-11 20:24:30
295
原创 Go-性能优化、自动内存管理
也可以引用计数:大于零就存活(这个就是内存管理和程序执行中了)类似于C++的智能指针。缺点是:原子操作开销大,循环引用,内存开销。在CVE漏洞平台上能看到 double-free 和use-after-free是很多的。可以解决:double-free use-after-free问题。追踪垃圾回收:标记根对象-找到可达对象-清理不可达对象。Collector:GC线程,找到存活的,回收死亡的。Mutator:业务线程,分配新对象。管理的是动态内存:malloc()安全性:不能回收存活的对象。
2024-11-08 15:28:29
360
原创 Go-HTTP框架设计实现概述
1.再谈HTTP协议第一个大规模使用:HTTP0.9 三十多年了HTTP:超文本传输协议(Hypertext Transfer Protocal)为什么是超文本:因为图片、音乐、视频是文本的扩充为什么需要协议:约定俗称的规则(像说话)有边界协议里有什么:1.请求行/状态行方法名 URL 协议版本/////////协议版本 状态码 状态码描述1xx:信息类2xx:成功3xx:重定向4xx:客户端错误5xx:服务端错误2.请求头/响应头3.请求体/响应体DEMO:packa
2024-11-08 11:43:21
630
原创 Go-性能调优实战案例
AB实验SDK优化 分析基础库的核心逻辑和性能瓶颈 压测验证 落地验证。单独的benchmark无法满足复杂逻辑分析 压测(单机器 集群)并且问题还有:cpu占用80%和40%的数据是不一样的 都采样一下。采样的是block的次数和耗时 阻塞得超过阈值才被记录。编译器 运行时优化 优化内存分配策略 也是压测-落地。采样的是争抢锁的次数和耗时 只记录固定比例的锁操作。通过内存分配器在堆上分配和释放的内存。看占用比较长的-定位代码-找到问题。记录程序创建的所有系统线程的信息。采样的是函数调用和占用的时间。
2024-11-07 10:28:12
328
原创 Go-性能优化、优化分析、调优实战pprof
使用官方自带benchmark进行基准性能测试第一个是函数名-核数 第二个是执行次数 第三个是一次执行时间第四个是一次执行的多大的内存 第五个是一次执行申请几次内存slice用的时候在make()初始化切片时提供容量信息slice:Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。在已有切片基础上创建切片,不会创建新的底层数组。
2024-11-07 09:38:41
785
原创 Go-高质量编程及编码规范
error尽可能提供简明的上下文信息链,方便定位问题。panic用于真正异常的情况。recover生效范围,在当前的goroutine的被defer的函数中生效。函数名不要携带上下文信息 serve就可以 不用serveHTTP 因为包名和函数名会成对出现的。包只用小写字母,不要下划线,不要变量名。:优先处理错误情况/特殊情况。gofmt(官方提供的自动格式化)解释作用、如何做、原因。
2024-11-06 15:38:15
220
原创 华为odC++一面-面经总结
多态:多态是指在运行时根据对象的实际类型来调用相应的方法,而不是根据引用或指针的静态类型。多态性是指同一个操作可以作用于不同类型的对象,并且可以根据对象的类型执行不同的行为。主要通过虚函数和函数重载实现。封装是指将数据和操作数据的方法封装在一个类中,隐藏类的内部实现细节,只对外部暴露必要的接口。通过封装,可以实现信息隐藏和保护数据的安全性,使得类的实现细节对外部用户透明,用户只需关注类的接口和功能。当通过父类的指针或引用调用虚函数时,会根据实际对象的类型来决定调用哪个版本的虚函数,从而实现多态。
2024-10-21 20:04:03
820
原创 滴滴C++一面-面经总结
C中的const就是变量的值不能修改 重定义就报错在C++中,const 用于指定不可变数据,包括不可变对象、不可变函数参数以及不可变成员函数。在C++中,还可以使用 const 对象来调用 const 成员函数,但是不能调用非 const 成员函数。初始化?想到构造函数-初始化列表(c++) 结构体的初始化函数(c)
2024-10-21 16:04:24
869
原创 快手C++二面-面经总结
cat words.txt:读取文件 words.txt 的内容。tr -s ' ' '\n':将空格替换为换行符,即将每个单词分隔到一行。sort:对单词进行排序。uniq -c:统计每个单词出现的次数,并在前面加上频率。sort -nr:按照频率降序排序。awk '{print $2, $1}':使用 awk 输出单词和频率,其中 2是单词,1 是频率。
2024-10-18 18:23:24
623
原创 百度IDGC++一面-面经总结
虚函数出现在多态、继承的情况中,在基类定义一个函数,在派生类可以重写。这也是运行时多态,虚函数就是函数前加上virtual关键字依赖虚函数表和虚表指针,只要有虚函数的类-就生成一个虚函数表。虚表指针指向这个虚函数表。查找对应的,调用函数。流量控制使用滑动窗口协议来控制流量。接收方通过广告窗口大小告诉发送方它能够接收的缓冲区大小,从而防止发送方过快地发送数据,避免接收方的缓冲区溢出。拥塞控制TCP 拥塞控制机制通过调整数据传输速率来防止网络拥塞。
2024-10-18 11:23:58
757
原创 小米C++开发一面-面经总结
构造的时候还没虚表呢,定义成虚函数也没办法确定正确的虚函数地址。1.还没虚表2.如果真的是虚函数 那子类构造的时候还要调用基类的构造函数,但是子类的成员白能量都还没初始化。因为只要涉及到多态、继承的时候,派生类的对象也需要被析构函数释放,如果只调用基类的析构函数。那会导致派生类的资源无法正确释放。
2024-10-17 11:54:11
917
原创 快手游戏服务端C++开发一面-面经总结
外部碎片指的是由于内存块的分配和释放操作导致可用的空闲内存被分割成许多小块,这些小块分布在整个内存空间中,而每个小块都不足以满足新的内存分配请求。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。内部碎片指的是分配的内存块内部未被使用的部分。先商定初始窗口大小----不超过窗口范围发送数据包-----ack返回能接受的大小----滑动到新的窗口发送新的数据。
2024-10-14 17:39:41
1011
原创 科大讯飞C++开发一面-面经总结
内存泄漏定义:内存泄漏是指程序在动态分配内存后,失去了对该内存的引用,但该内存并没有被释放。要避免在多线程环境中出现多个实例,常用的策略是使用双重检查锁定(Double-Checked Locking,DCL)。在 C++ 中,可以通过使用互斥锁(std::mutex)来保护实例的创建。在调用 delete this 后,this 指针所指向的内存将被标记为可用,但指针仍然存在。std::move 将对象 a 转换为右值引用,从而调用移动构造函数,避免了复制的开销。,确保保持参数的值类别。
2024-10-13 17:52:38
959
原创 小红书C++引擎架构一面-面经总结
B树:自平衡的多路搜索树,保持数据有序。多路搜索-平衡-节点结构复杂-空间利用率低B+树:就是变种 可以顺序访问和范围查询了文件系统 数据库索引B树用于高效查找、插入、删除B+树用于顺序访问 范围查询 InnoDBmap他是基于红黑树实现的 自平衡 二叉是搜索树 有序 插入删除查找都是logn开销还比较大而另一个就是无序的容器 是哈希表 根据哈希函数的输出确定存储位置理想状态的时候是o1 哈希在大量数据的时候是节省空间的。
2024-10-13 17:13:52
1316
原创 字节C++抖音直播一面-面经总结
大小可以动态改变,自动分配更多的内存。(但是建议reserve 因为有复制)可以存储基本类型 自定义类型 还可以存放对象可以对元素随机访问,支持下标直接访问自动处理内存分配和释放。
2024-09-29 10:32:25
497
原创 快手C++一面-面经总结
在这个模板类的析构函数中,如果创建新的shared指向同一个资源的时候,引用计数+1,但是离开作用域或者销毁,就会-1.当等于0的时候,就释放资源,销毁控制块。第二次握手:server收到,以自己的SYN为应答,把自己的初始化序列号发送回client,并且把client的初始化序列号+1作为ACK返回。RAII是资源获取就初始化,把资源的获取和释放绑定到对象的生命周期内,利用对象的构造函数和析构函数来管理资源。就是个模板类,可以管理动态分配的对象,template的typename指定管理的资源的类型。
2024-09-27 10:49:20
1401
原创 字节豆包C++一面-面经总结
lc206:链表反转:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。lc70爬楼梯进阶,爬楼梯高级进阶:一次可以跳1-n阶台阶爬楼梯原版:假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?扩展:(ACM)
2024-09-26 10:36:58
1288
原创 LeetCode138 随机链表的复制
构造这个链表的 深拷贝。深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。一个<Node*,Node*>的哈希表 存原先的链表节点和现在的链表节点。返回复制链表的头节点。
2024-09-25 16:16:41
250
原创 Momenta中间件C++一面-面经总结
2 内存模型:C++ 的原子操作提供了几种内存序模型,例如 memory_order_relaxed、memory_order_acquire 和 memory_order_release,以控制操作的内存可见性顺序。在这个模板类的析构函数中,如果创建新的shared指向同一个资源的时候,引用计数+1,但是离开作用域或者销毁,就会-1.当等于0的时候,就释放资源,销毁控制块。就是个模板类,可以管理动态分配的对象,template的typename指定管理的资源的类型。中,并链接到程序的执行过程中。
2024-09-25 10:05:17
1133
原创 LeetCode146 LRU缓存
在LRUCache函数中 要clear哈希表,并且把tail加进双链表。在addNode中 如果有 可以直接返回 如果没有就需要弄个cur。在deltNode中 如果没有 可以直接返回 如果有就erase他。在put操作中,如果有,就先deletNode 再addNode。如果有 就要先给他deletNode 再给他addNode。如果等于容量:那就把tail前一个给他deleNode了。删除的操作就是把他的前后找到 然后前后接上 把他悬挂。在get操作中,如果没有这个 返回-1;
2024-09-24 16:47:22
530
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人