自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 收藏
  • 关注

原创 如何修改git的commit消息

场景命令备注刚提交,未推送最安全、最简单修改历史中的某次把pick改为reword已推送到远程修改后慎用,仅限个人分支还有两种工具主要用于批量修改历史记录。如果你需要修改全部或者一大批commit 消息(例如:给所有过去的提交都加上 Jira 编号,或者批量替换掉某个敏感词),那么rebase -i会太慢太累,这时候就需要用到filter。用或。如果不想装新软件,用。如果追求速度和安全(推荐),装一个。

2025-12-01 17:43:53 1847

原创 突破 TCP/IP 枷锁:从 JRPC 到 RDMA,上下位机通信性能优化全景指南

JRPC 是一种“方便”的方案,而不是“高性能”的方案。当你在调试上下位机通信延迟时,不要盲目怀疑网络硬件。很多时候,仅仅是将 JSON 换成二进制协议,就能解决 80% 的性能问题。只有当软件优化到了尽头,才是 RDMA 等硬件加速技术登场的时候。

2025-11-24 16:09:45 1045

原创 从模糊到真实:一文看懂AE家族的演进史 (AE, VAE, VQ-VAE, VQ-GAN, LDM-VAE)

出现(VQ-VAE/GAN):为了解决经典 VAE 的模糊问题,通过离散化来解放模型的重建能力。这非常适合与处理离散序列的模型结合。消失(LDM):为了适配下游扩散模型的需求,需要一个连续空间。同时,研究者发现 VQ-GAN 的成功秘诀(对抗训练)可以被**“移植”**到连续空间模型上,从而在不使用码本的情况下也能实现高保真重建。所以,这不是简单的技术倒退,而是一次**“扬弃”**。LDM **“扬”了 VQ-GAN 的对抗训练思想,

2025-11-12 17:35:50 429

原创 从`std::mutex`到`std::lock_guard`与`std::unique_lock`的演进之路

特性手动lockunlockRAII否是是是异常安全否 (需手动处理)是 (核心优势)是 (核心优势)是 (核心优势)灵活性高 (但危险)低 (构造时加锁,析构时解锁)高 (支持延迟、手动、转移)中 (类似但用于共享)与条件变量配合否否是 (必需)否适用互斥体所有所有所有仅等性能开销最低极低 (几乎无开销)略高 (需维护状态标志)略高 (需维护状态标志)

2025-11-05 18:14:03 1107

原创 为什么 `std::condition_variable` 必须与 `std::mutex` 配合使用?

std::mutex(互斥锁)目的:提供互斥(Mutual Exclusion)机制。核心操作lock()和unlock()。保证:确保在任何时刻,只有一个线程能够进入由该互斥锁保护的临界区(Critical Section)。其主要用途是防止多个线程同时读写共享数据而导致的数据竞争(Data Race)。(条件变量)目的:提供线程间的通信机制,允许一个或多个线程等待(wait)某个特定条件成立。核心操作wait()。机制:当一个线程发现其工作所需的前置条件不满足时,它可以调用wait()

2025-11-05 17:52:03 422

原创 Claude Code更换供应商:Base URL和API Key的注意事项

claude工具更换 API 配置的“魔幻”问题,归根结底是缓存优先和环境变量作用域不明确两个因素在作祟。API Key 不更新?-> 清缓存或重装。Base URL 不生效?-> 用户和系统变量全配上。希望这篇踩坑总结能帮你节省宝贵的时间,让你专注于真正重要的编码工作,而不是和环境变量斗智斗勇。

2025-10-25 21:55:08 3519

原创 Windows环境变量终极指南

解开“为什么我设置的变量不生效?”之谜对于每一位在 Windows 上进行开发的程序员来说,配置环境变量都是一项基本功。但你是否也曾陷入这样的困惑:刚刚通过命令行设置了API_KEY,但应用却提示找不到?或者用控制面板设置后,重启终端依然无效?这些问题的根源在于 Windows 提供了多种设置环境变量的方法,而每种方法在**作用域(Scope)持久性(Persistence)**上都有着天壤之别。本文将为你彻底梳理这些方法,让你从此告别困惑,像专家一样管理你的 Windows 环境。

2025-10-25 21:47:28 457

原创 pytorch 数据加载加速

默认是阻塞的默认是阻塞操作,因为它需要处理可分页内存,以保证安全性。实现非阻塞:要实现真正的非阻塞 CPU->GPU 传输,必须满足两个条件:源 CPU 张量位于锁页内存中(通过在.to()调用中指定。DataLoader是关键:在实际应用中,手动调用比较繁琐。最佳实践是在创建时设置。这会自动将每个数据批次加载到锁页内存中,使您可以在训练循环中无缝地使用非阻塞传输,从而极大地提升 GPU 的利用率和训练速度。同步点:请记住,异步操作并非没有代价。

2025-10-16 20:20:08 978

原创 PyTorch Dataloader工作原理 之 default collate_fn操作

它检查一批样本的数据结构(是元组、字典还是其他)。它“转置”这个结构,将所有样本的“第一部分”放在一起,所有样本的“第二部分”放在一起,以此类推。对于每个集合起来的部分,它会根据其数据类型应用(如果是张量、数字等)或递归地调用collate过程(如果是更复杂的嵌套结构)。这个过程的前提是,所有待堆叠的张量必须具有完全相同的形状。如果形状不一(例如,变长的文本序列),就会失败,这就是为什么在这种情况下你需要提供一个自定义的collate_fn来进行 padding 等操作。

2025-10-16 20:05:05 730

原创 PyTorch DataLoader 高级用法

方式作用如何工作互斥参数适用场景控制是随机还是顺序采样内部使用或无最简单、最常见的场景。定义单个样本的抽取顺序提供一个生成索引序列的迭代器shuffle需要复杂采样逻辑,如类别均衡、子集采样等。定义批次索引列表的生成方式提供一个生成索引列表的迭代器batch_sizeshufflesamplerdrop_last需要控制批次内部的构成,如按长度分组以减少padding。collate_fn的职责是在DataLoader从Dataset获取到一个样本列表后,将这个列表。

2025-10-16 19:55:22 935

原创 RDMA与IPC

RDMA是为跨节点(机器之间)的高性能通信而生。在同节点内部使用它,会因为“硬件环回”而变得低效。对于同节点内部的通信,应该使用IPC机制,这是为此专门设计的。在各种IPC机制中,共享内存(shmem)提供了最高性能,因为它实现了真正的零拷贝,但它也带来了最高的编程复杂性(需要手动同步)。因此,您的理解非常准确。跨机器通信,追求极致性能 -> RDMA同一台机器内通信,追求极致性能 -> 共享内存 + 同步原语(如互斥锁/信号量)

2025-10-04 11:37:36 706

原创 python加速方法 对比 numba numb.cuda triton pycuda cupy

库核心思想编程范式抽象级别最佳应用场景Numba将 Python 函数 JIT 编译为CPU机器码保持 Python 循环语法中加速无法向量化的 CPU 密集型循环CuPyNumPy 的 GPU 替代品高级 API 调用,向量化高将现有的 NumPy/SciPy 代码快速迁移到 GPUPyCUDA在 Python 中写 CUDA C++底层 CUDA C++ 编程低需要极致硬件控制和性能的复杂内核开发Numba.cuda用 Python 语法写 CUDA 内核。

2025-09-30 21:59:52 979

原创 python C++字符串格式化

方法语法引入版本性能推荐场景f-Stringsf"{var}"最快日常开发首选,几乎适用于所有场景。较快需要兼容旧版 Python (3.5及以下);或需要将格式化模板作为变量传递时。操作符"%s" % varPython 2.x较慢维护非常古老的代码;或在某些标准库(如logging)中仍然常用。新代码中应避免使用。$var最慢处理来自不可信用户的输入模板,安全第一的场景。总而言之,经验法则是:只要你的项目使用 Python 3.6 或更高版本,就始终使用 f-strings。

2025-09-15 10:46:26 1172

原创 TensorRT自定义量化 对数量化

插件是扩展TensorRT的唯一途径:对于非原生支持的操作,必须编写插件。:是实现支持动态尺寸插件的标准接口。序列化/反序列化:这是将插件及其参数固化到.engine文件中的关键,使得引擎可以被独立加载和执行。enqueue:插件的性能核心,在这里调用高度优化的CUDA代码。:精确定义插件支持的数据类型和内存布局,是配置阶段的“守门员”。输出类型:本示例为了简化,输入输出都用了FP32。在真实的量化场景中,你可能会希望输出INT8类型。这时,你需要在和中指定,并且你的CUDA核函数需要将结果写入。

2025-09-08 15:48:06 1057

原创 C++ Rust与Go

C++ 作为一门历史悠久且性能卓越的编程语言,在许多领域都占据着主导地位。然而,随着现代编程语言 Rust 和 Go 的崛起,它们在 C++ 的传统应用领域中提供了强有力的替代方案。这两种语言各自凭借其独特的设计哲学,在不同层面展现出优势。总体而言,旨在成为 C++ 的现代化、更安全的直接替代品,专注于性能和安全;而则在需要高并发和网络服务的领域,提供了一种更简单、开发效率更高的选择。

2025-08-12 18:09:46 1350

原创 Tauri Qt孰优孰劣

当你的应用需要处理复杂的业务逻辑、进行高性能的图形渲染,或者要求与操作系统进行深度交互时,Qt 的 C++ 原生性能和全面的功能库将是不可替代的。此外,Tauri 的前端(JavaScript)与后端(Rust)之间通过 IPC(进程间通信)进行交互,传递大量数据时会产生序列化开销和一定的延迟,这是在架构设计时需要考虑的性能瓶颈。一个简单的 Qt Widgets 应用,即使经过静态编译和优化,也可能在 5MB 左右,而包含更多模块和功能的复杂应用,其体积很容易达到数十 MB。

2025-08-12 17:39:13 1387

原创 conda pip uv与pixi

简单来说,uv和pixi都是为了解决传统 Python 包管理和项目环境管理中的痛点而生的新一代工具,它们的核心优势在于和。uv。

2025-08-08 09:58:51 1397

原创 svn与git Merge重要区别讲解

合并类型核心目的方向常用命令关键点同步合并让分支保持最新在分支生命周期中会多次执行重入合并将分支成果合并回主干分支生命周期最后一次操作,之后分支废弃拣选合并应用特定的变更任意URL -> 当前目录常用于紧急修复,只拿需要的变更差异合并计算并应用任意两点间的差异URL1 vs URL2 -> 当前目录最底层原理,可用于合并无关联分支反向合并撤销已提交的变更历史变更 -> 当前目录用于回滚错误提交理解了这五种目的,你就能在任何场景下选择最合适的merge方式了。

2025-07-28 09:00:07 932

原创 C#最著名的委托(delegate)是什么,他与C++的function有何区别??

是什么?委托是类型安全的方法指针,是一个定义方法签名的引用类型。为什么用?实现解耦,允许将方法作为参数传递(回调),是事件模型和 LINQ 的基石。怎么用?(可选)声明一个delegate类型。创建一个该委托类型的实例,并让它指向一个签名匹配的方法。通过委托变量调用方法。新写法?尽量使用内置的Action<>和Func<>泛型委托,代码更简洁标准。特性C#delegateeventC++本质语言内置的高级类型标准库提供的类模板调用目标多播 (Multicast),支持+=和-=

2025-07-26 15:22:04 830

原创 Mingw 与MSYS2 与Cygwin区别

这是一个非常经典的问题!这三者关系紧密但又定位不同,很容易让人混淆。我们来用一个生动的比喻,然后深入技术细节,彻底辨析它们的区别。

2025-07-26 15:02:16 1535

原创 C++ explicit 上下文相关转换

C++ 允许程序员为自己的类定义转换规则,主要有两种方式[3][4]转换构造函数 (Converting Constructor):一个可以只用一个参数调用的构造函数(非explicit它定义了如何将参数类型转换为类类型。转换运算符 (Conversion Operator):一种特殊的类成员函数,定义了如何将类类型转换为其他类型[5]。默认情况下,这些用户定义的转换可以是隐式的,即编译器可以在需要时自动调用它们,无需程序员显式指示[4]。explicit。

2025-07-24 15:42:03 858

原创 CUDA/C++一种可能通不过编译的写法

嵌套在 namespace/class 里的依赖模板,直接写往往会被当成函数声明。标记它是一个“类型”,就要写成更清爽的做法是先using(或typedef)把它 alias 出来,再直接用别名来声明变量。这样无论后面是cudaMemcpy还是for循环还是单次调用,都绝对不会再出现“identifier ‘float_supporter’ is undefined” 这种诡异的编译错误了。

2025-07-24 13:20:19 447

原创 ImageNet与COCO数据集主要区别

在计算机视觉领域,ImageNet 和 COCO 是两个无法绕开的名字。它们不仅是海量的数据集,更是推动 AI 技术浪潮的基石。然而,尽管它们都与“图像”和“物体”相关,其设计理念、核心任务和在现代 AI 开发流程中的角色却截然不同。本文将深入解析这两大巨头的核心区别,帮助你理解它们为何如此重要,以及如何协同工作。

2025-07-24 11:42:02 636

原创 OpenCV Mat UMat GpuMat Matx HostMem InputArray等设计哲学

行为模式调用方式适用场景设计目的转发/代理直接调用等的方法。处理所有数组类型都支持的通用操作。抽象与多态:隐藏具体实现,让函数可以处理多种数据类型。直接获取先调用等获取具体引用,再调用该引用的特有方法。处理某个特定数组类型才有的专属操作。灵活性与完整性:不限制开发者使用具体类的全部功能。所以,您的观察是完全正确的。OpenCV 的代理类设计,是一个在高度抽象(为了易用和通用)和完全控制(为了性能和功能完整性)之间取得精妙平衡的典范。

2025-07-22 17:25:51 1652

原创 SVN使用过程中的几个疑问与解答

特性方式一:导入 (Import)方式二:创建后检出 (Create & Checkout)初始动作在本地文件夹上右键 ->导入在服务器上用版本库浏览器创建目录结构优点操作快,一步到位把文件传上服务器结构清晰,从一开始就遵循标准,是最佳实践缺点原始文件夹不会成为工作副本,必须重新检出,容易让新手混淆步骤稍多(创建->检出->复制->添加->提交)适用场景快速将一个已存在的、混乱的项目归档到SVN所有新项目的标准流程,强烈推荐虽然你可以直接“导入”本地文件夹,但我们强烈推荐使用第二种方式。

2025-07-18 15:19:33 1074

原创 GPTQ与Unsloth量化区别

演进关系:Unsloth 的方法可以看作是建立在 GPTQ 这类技术之上的更高层次的优化。理论上,Unsloth 在决定对某个层进行 4-bit 量化时,完全可以调用 GPTQ 的算法来执行这个具体的量化步骤,以获得最佳的 4-bit 压缩效果。“笨”方法 vs “聪明”方法:GPTQ 是一种非常精密的“笨”方法——它在给定的严格约束下(必须 4-bit)做得最好。

2025-07-17 15:09:11 979

原创 一个Type Triats(SFINAE)的例子讲解

默认值属于主模板:默认模板参数是在主模板(泛化版本)中定义的。特化版本“借用”默认值:当用户调用模板时没有提供所有参数,编译器会使用主模板中定义的默认值来“补全”调用。然后,它用这个补全后的、完整的模板参数列表去寻找最匹配的特化版本。特化版本中的T是一个占位符:在中,T只是一个占位符,它会捕获主模板调用中第二个参数的实际类型——无论这个类型是用户显式提供的,还是由主模板的默认值void提供的。

2025-07-17 14:58:49 892

原创 CAS原子操作为什么失败后要修改期望值?

将 CAS 失败时原子变量的当前值返回给调用者,是基于对该操作实际使用模式的深刻理解而做出的设计决定。失败是常态:在多线程高竞争环境下,CAS 操作的失败是正常情况,而不是异常。[4][5]因此,必须为失败后的重试提供最高效的路径。提供重试所需的信息:要重试,就必须知道当前的值是多少,否则下一次尝试依然会基于过时的信息而失败。在失败时直接提供这个新值,是最高效的方式。硬件层面的支持:底层的硬件指令(如 x86 的)在执行时就已经加载了当前值。[1]

2025-07-17 10:54:33 1003

原创 C++异步编程工具 async promise-future packaged_task等

特性std::async抽象级别高低中核心作用启动一个异步任务并返回future在线程间手动传递一个值或异常包装一个可调用对象,将其与future绑定线程管理自动(由运行时库决定)手动(需要自己创建和管理线程)手动(需要自己将任务对象传递给线程执行)耦合度任务的调用和执行紧密耦合值的“生产者”和“消费者”完全解耦任务的“定义”和“执行”解耦主要用例简单的“即发即忘”式异步调用复杂的线程间通信,事件驱动模型任务队列,线程池实现。

2025-07-17 10:19:56 986

原创 程序中计时的多种方法(以C++为例)

方法平台测量类型精度推荐度墙上时间高 (微秒)中等 (平台相关)Windows墙上时间非常高 (微秒/纳秒)中等 (平台相关)跨平台墙上时间 (steady/high_resolution_clock)高强烈推荐clock()跨平台CPU 时间低 (通常是毫秒)不推荐用于精确测量对于新的 C++ 项目,无论在哪个平台,都应优先选择 std::chrono。只有在必须兼容旧的C代码库或有特殊平台需求时,才考虑其他方法。

2025-07-15 12:04:05 686

原创 Cmake简介

特性.cmake文件核心作用项目/目录的构建蓝图、入口点可重用的脚本、模块、函数库调用方式CMake 自动查找并执行必须通过include()等命令显式调用主要内容定义项目 (project)、目标 ()、依赖关系定义函数/宏、查找外部库、设置变量/选项类比C++ 中的main.cppC++ 中的.h.cpp库文件或 Python 模块负责项目的整体结构和构建流程,而.cmake文件则将通用的、复杂的或与特定功能相关的逻辑封装起来,以保持的整洁和可维护性。

2025-07-14 10:24:37 881

原创 LLM的几点疑问探讨

特性LoRA (及其他PEFT方法)全量微调 (Full Fine-tuning)可训练参数极少 (通常 < 1% of total)全部 (100%)核心原理冻结主干,附加旁路适配器更新所有参数数据需求可以只使用垂直领域数据必须混合垂直领域数据和通用数据灾难性遗忘风险低高产出物原始模型 + 一个很小的LoRA适配器文件一个全新的、与原始模型同样大小的完整模型文件适用场景快速、低成本地让模型适应特定任务或风格当需要对模型进行更深层次的、根本性的能力改造时。

2025-07-10 14:44:01 772

原创 Windows对高性能计算的掣肘

方法实现方式优点缺点适用场景1. 代码重构与多线程将逻辑合并到单个源项目,用并行。最高效、最简单、开销最小。需要访问和修改所有源代码。首选方案。当您可以完全控制代码库时。2. IPC服务器模式创建一个GPU服务器进程,原始进程通过IPC发送请求。唯一能在不修改源码的情况下工作的方案。极其复杂,性能开销大,开发周期长。当您面对的是无法修改的、黑盒的.exe文件,且性能要求极高以至于必须并发时。自己实现的server.exe和NVIDIA官方的MPS,在工作原理和最终效果上有天壤之别。

2025-07-08 15:47:08 1011

原创 MPI openMP CUDA openACC混合编程基础框架和简单例子

模型层级目标硬件内存模型核心任务MPI最高层 (跨节点)计算机集群 (Cluster)分布式内存任务分解与节点间通信OpenMP中间层 (节点内)多核CPU共享内存利用单个节点内的所有CPU核心最底层 (设备卸载)GPU等加速器独立的设备内存加速计算密集型代码段。

2025-07-08 15:18:46 799

原创 C++函数指针

想象一下,变量可以存储一个整数(int a = 10;),也可以存储一个内存地址(函数指针也是一个变量,但它特殊的地方在于,它存储的是一个函数的入口地址。通过这个指针,你就可以像调用普通函数一样,间接地调用它所指向的那个函数。这就像一个可以随时切换频道的“万能遥控器”。类型声明语法赋值调用优点缺点普通函数指针p = &funcp(args)C语言兼容,底层语法复杂,类型不灵活成员函数指针能指向成员函数语法非常复杂,必须绑定对象f(args)语法统一、灵活、安全有轻微性能开销,需要头文件。

2025-07-03 14:08:11 920

原创 C++函数的返回值是否应该用引用?具体规则详述

一种情况是返回右值引用,用来初始化普通值(触发移动构造)public:// 返回对成员变量的右值引用// 1. my_obj 在这里被创建,其生命周期持续到 main 函数结束// 2. 调用成员函数,它返回一个指向 my_obj.cpu_mat 的右值引用。// 因为 my_obj 还活着,所以 my_obj.cpu_mat 也活着。这个引用是有效的。

2025-07-01 12:03:46 547

原创 C与C++中的可变参数

下面先区分一下两种“可变参数”机制,再重点讲讲 C++11 引入的。

2025-06-18 09:48:20 494

原创 C++ 条件变量虚假唤醒问题的解决

在 C++ 中, 的 和 方法除了可以传入一个锁(),还可以传入一个谓词函数(函数或可调用对象)。这个谓词的作用是让条件变量在特定的条件满足时才退出等待。谓词是一个返回布尔值的函数或可调用对象,它用于判断某个条件是否满足。如果条件不满足, 会继续阻塞当前线程;如果条件满足,线程会立即退出等待状态。如果不使用谓词,必须手动在循环中检查条件:在这种情况下, 只是等待被唤醒,但必须手动在循环中检查 是否为 。否则,线程可能会因为虚假唤醒提前退出。通过传入谓词,可以让 方法自动检查条件,避免手动循环:解

2025-05-26 11:02:46 895

原创 static_cast,dynamic_cast 与隐式强制转换

{}

2025-05-26 09:47:18 1153

原创 C C++中怎么定义一个函数的指针

分别给出在 C 和 C++ 中声明(引出)普通函数指针和成员函数指针的示例。

2025-05-23 08:25:11 388

空空如也

空空如也

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

TA关注的人

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