- 博客(111)
- 收藏
- 关注
原创 生成式AI系列(二) LLM生成质量改善的方法——RAG检索增强生成
检索增强生成(RAG)是一种利用信息检索来优化LLM输出的技术,通过在生成结果之前引用训练数据之外的知识库,丰富了上下文,从而增强生成内容的准确性。
2025-03-08 20:44:39
503
原创 代码重构——表驱动替代if-else或者switch-case (C++版)
表驱动方式代码量少,逻辑清晰,更符合设计模式思想,方便函数增添或者删除。但是在c++里需要用到函数指针、指针数组,对新手不友好。但是如果采用合理的索引表,在数据量较大的情况下可以有效提升程序运行速度。表驱动优化if-else[c++]_switch case 修改为c++驱动表-优快云博客。
2024-12-14 20:22:27
478
原创 leetcode股票买卖系列题目(动态规划)
最近A股大火,那么收集一下leetcode股票买卖系列题目来刷刷。股票买卖系列题目这类问题都可以用动态规划DP来解决。上述的第二和第三步,合起来就是建立。
2024-11-24 12:10:33
349
原创 区间特征值求解技术——围道积分法(Contour Intergral Method)
区间特征值问题:求解Ax = λBx 在区间[λmin, λmax]的特征值。
2024-11-20 17:38:48
1299
原创 数据结构可视化网站
Data Structure VisualizationCurrently, we have visualizations for the following data structures and algorithms:
2024-10-05 17:43:58
892
1
原创 稀疏线性方程组求解技术——超节点法(Supernodal)简介
直接法的基础是矩阵的分解,常见的分解形式有LU分解、Cholesky分解、LDL分解等。直接法通过将A矩阵分解成两个或多个因子的乘积,使得原方程组转化为若干个较容易求解的子问题。例如LU分解A=LU,其中L是单位下三角矩阵,U是上三角矩阵。原方程转化为LUx=b,可以通过依次求解Ly=b和Ux=y两个三角方程组来得到原方程的解。稀疏线性方程组的两类常见直接求解算法分别为方法和法,其主要思想是将完整的稀疏矩阵的分解任务转化成许多个相对稠密的子矩阵的分解任务。
2024-09-25 15:59:37
1632
原创 C++如何进阶? -- 整理一些学习资料
在学习完C++最基础的知识后,需要对C++有更近一步的认知。看门见山,首先贴出学习资料:侯捷老师的这几个视频是每个学习C++的人都应该仔细看几遍下来的,只看一遍是绝对记不住的具体来说必看的两本书,或者说,必看的两本书和一章节是STL源码剖析、Effective C++、深度探索C++对象模型第三章(虚函数)。而选看的两本书: More Effective C++、深度探索C++第三章以外的部分。
2024-09-22 12:00:52
428
原创 C++返回值优化(Return Value Optimization, RVO)与移动语义(Move Semantics)
在C++编程中,返回值优化(Return Value Optimization, RVO)与移动语义(Move Semantics)是提高程序效率、减少不必要的对象复制的重要机制。
2024-09-19 20:51:38
449
原创 生成式AI系列(一)一文入门生成式AI(理解ChatGPT的原理)
以ChatGPT为代表的生成式AI,是对已有的数据和知识进行,总结出数据的。从而在生成内容时,根据用户需求,结合关联字词的。可以这么联想,ChatGPT就是一个的机器,他会根据你给出的关键词,自动生成关键词的下一个最有可能衔接的词语。比如你说,“世界上最高的山”,ChatGPT就会回答“喜马拉雅山”。大模型需要:算力、数据/存力、算法这三大要素。算力:即需要GPU、NPU这些硬件进行训练。数据/存力:生成式AI需要处理和存储大量的数据。以GPT-3为例,光是训练参数就达到了1750亿个,
2024-09-17 22:14:00
1590
1
原创 钥匙和房间的题解——使用dfs或bfs进行图遍历
这 n 个房间看成有向图中的 n 个节点,在x号房拿到了打开y号房的钥匙,可以看作是图中的 x 号点到 y 号点的一条有向边。这样一来,问题就变成了给定一张有向图,询问从 0 号节点出发是否能够到达所有的节点。
2024-09-17 11:35:03
371
原创 线性方程组求解——预处理Preconditioning介绍
通俗地说, 预处理就是将难以求解的问题转化成等价的容易求解的新问题对于线性方程组而言, 预处理就是对(病态) 系数矩阵进行适当的线性变换,转换为一个(良态) 新矩阵, 从而达到改善迭代法收敛性的目的.预处理子选取基本准则:一个好的预处理子P 通常需满足下面两个要求:(1)具有更小的条件数和(或) 更好的特征值分布;P是A的一个很好的近似。(2) 线性方程组Pz = r 容易求解, 即预处理子P 的使用成本低廉.▶ 第一条是为了确保预处理后的线性方程组更容易求解, 即预处理子有效。
2024-09-11 16:08:24
1453
原创 混合精度、异构计算——杂记
SM是streaming multiprocessor的简写,4个处理单元组成一个SM,如Figure 2。每个SM有64个INT32,64个FP32,32个FP64的CUDA core;每个SM还有4个Tensor Core。SM内共享L1缓存。CUDA Core是用作通用计算的,Tensor Core是专门针对深度学习优化的,负责矩阵运算、混合精度运算。Figure 1Figure 3展示了NVDIA不同代GPU的特性。Figure 3. 各代GPU架构。
2024-08-04 10:34:25
550
原创 好书推荐——《Parallel and High Performance Computing》(并行计算与高性能计算)
本书是由Robert Robey和Yuliana Zamora合著的专业著作,不仅从基础概念讲起,逐步深入到高级主题,还涵盖了最新的并行计算技术,如多核处理器、GPU加速和分布式计算系统。通过案例分析和实际应用,本书使理论与实践相结合,详细介绍了。等行业内标准工具的使用,适合计算机科学与工程专业的学生、研究人员、开发者以及对高性能计算技术感兴趣的技术爱好者。,任职于美国洛斯阿拉莫斯国家实验室,30多年来一直活跃在并行计算领域。出版日期:2021年。
2024-07-22 12:57:05
987
1
原创 内存问题检测工具——Valgrind
Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存、访问数组时越界、忘记释放动态内存等问题。Valgrind最好和GCC编译器配合使用。或者,MPI分布式运行。
2024-07-22 11:31:53
263
原创 slurm常用命令——多线程、多进程设置
这个命令是在用户的bashrc文件中添加一个名为"sq"的别名,用于列出当前用户的所有作业信息。具体来说,它使用了squeue命令来查询当前用户的所有作业信息,并将结果输出到终端。输出的信息包括作业ID、作业所属的分区、作业名称、作业提交者、作业状态、作业使用的内存、作业运行时间、作业的优先级等。这是一个用于查看当前用户正在运行的作业的命令。它将显示作业的ID、分区、作业名称、用户、状态、内存使用情况、节点和运行时间。
2024-05-09 17:43:44
1458
原创 c++中constexpr的一个用法——在泛型编程中的作用
constexpr`是C++11引入的关键字,用于指示编译器在编译时进行计算和优化,以便在运行时获得更好的性能。在这个特定的上下文中,`constexpr`用于在编译时检查一个条件,并根据该条件的结果在编译时执行不同的代码。如果条件为`true`,则编译器将执行`if`语句中的代码块。如果条件为`false`,则编译器将忽略`if`语句中的代码块。这在泛型编程(运用模版)中很有作用,由于模板的typename类型可以改变,但是如果我们某段代码需要执行只有Type类型的变量才有的方法/属性。
2024-05-08 16:53:44
288
原创 c++多线程2小时速成
c++多线程基础需要掌握这三个标准库的使用:std::thread,std::mutex, andstd::async。
2024-05-04 17:36:18
1366
原创 Linux易错指令: 文件覆盖>和文件追加>>
指令 > : 如果文件存在,将原来文件的内容覆盖;原文件不存在则创建文件,再添加信息。指令 >>:不会覆盖原文件内容,将内容追加到文件的尾部。
2024-04-18 16:08:47
189
1
原创 非线性系列(二)—— 共轭梯度法 Conjugate Gradient Method (线性及非线性)
CG方法第一次被用来解非线性优化问题,是由Fletcher和Reeves提出的。(英语:BiConjugate gradient method)提供了一种处理非对称矩阵情况的推广。共轭梯度法(英语:Conjugate gradient method),是求解系数矩阵为。共轭梯度法中,搜索方向p,是关于A共轭的,即。最后的解为 [1, 1],f(x)最小值为0。其中delta为方向,beta为步长。共轭梯度法是一个迭代方法,它适用于。的线性方程组的数值解的方法。1. 求解线性方程组,首先安装自动微分工具。
2024-04-14 08:10:46
2559
原创 非线性系列(一)—— 非线性方程组求解与优化的关系 Nonlinear & Optimization
解非线性方程(Nonlinear Equations)的技术在其动机、分析和算法实现方面与优化技术(Optimization)有重叠。
2024-04-08 21:10:45
851
原创 分割数组的两种解法:动态规划、二分法
(包括当前子数组),那么每当 sum 加上当前值超过了 cnt,我们就把当前取的值作为新的一段分割子数组的开头,并将 cnt 加 1。遍历结束后验证是否 cnt 不超过 k。本题中,我们注意到:当我们选定一个值 x,我们可以线性地验证是否存在一种分割方案,满足其最大分割子数组和不超过 x。地模拟分割的过程,从前到后遍历数组,用 sum 表示当前分割子数组的和,cnt 表示已经分割出的。「将数组分割为 m 段,求……」是动态规划题目常见的问法。最大值尽可能小」是二分搜索题目常见的问法。
2024-03-24 15:24:48
282
1
原创 License授权的基本思路
对于收费软件,一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够使用软件。于是有的小伙伴就开始好奇这个许可是怎么实现的,特别是在情况下它是怎么给软件授权,同时又能避免被破解的。
2024-03-22 16:10:39
2120
1
原创 C++ 智能指针的正确使用方式:unique_ptr VS shared_ptr
我们大多数场景下用到的应该都是 unique_ptr。unique_ptr 代表的是专属所有权,即由 unique_ptr 管理的内存,只能被一个对象持有。所以,unique_ptr 不支持复制和赋值// 编译错误如果想要把 w 复制给 w2, 是不可以的。因为复制从语义上来说,两个对象将共享同一块内存。因此,unique_ptr 只支持移动// w2 获得内存所有权,w 此时等于 nullptr。
2024-03-14 10:50:10
4785
2
原创 NUMA(Non-Uniform Memory Access)架构的介绍
最早的CPU是以下面这种形式访问内存的:在这种架构中,所有的CPU都是通过一条总线来访问内存,我们把这种架构叫做SMP架构(Symmetric Multi-Processor),也就是对称多处理器结构。但是随着CPU多核技术的发展,,因为所有的处理器都通过一条总线连接起来,因此随着处理器的增加,系统总线成为了系统瓶颈,另外,处理器和内存之间的通信延迟也较大。
2024-03-10 17:33:11
1928
1
原创 奇异值分解(SVD)的应用——图像压缩
我们想寻找一个A的逼近:Ak,使得rank(Ak) = k < n,且|A - Ak|最小。下面的定理(也称为Schmidt-Mirsky, Eckart-Young定理。
2024-02-10 20:41:04
1266
1
原创 MPI 集体通信(collective communication)
MPI_REDUCE将组内每个进程输入缓冲区中的数据按给定的操作op进行运算,并将其结果返回到序列号为root的进程的输出缓冲区中。
2024-01-28 21:30:03
1451
原创 MPI并行计算第一课(2小时入门)
MPI 全名叫 Message Passing Interface,即信息传递接口,作用是可以通过 MPI 可以在不同进程间传递消息,从而可以并行地处理任务,即进行。
2024-01-21 11:37:11
4220
原创 Leading Dimension是什么
矩阵在内存中存储时是连续地按(某种)顺序存储的,比如下图,A矩阵是列主序,那么A(0,0)和A(0,1)之间其实是不连续的,相隔了ldA个元素。在LAPACK中频繁出现Leading Dimension(中文翻译为“主维度”),那么它是什么呢?可以看到,里面的LDA就是A的行数。
2024-01-14 12:00:56
823
1
原创 SOLID之依赖倒置原则
依赖倒置原则(DIP,Dependence Inversion Principle)的定义是:高层模块不应该依赖底层模块,两者都应该依赖其抽象。抽象不应该依赖细节,即接口或抽象类不依赖于实现类。细节应该依赖抽象,即实现类不应该依赖于接口或抽象类。在具体软件设计时,上层模块不应该依赖于底层模块,底层模块更不应该依赖上层模块,而是上层模块和底层模块都向中间靠拢,共同依赖于二者中间的。整个软件程序设计的依赖关系应该终止于抽象接口层,上层和底层互不关心,甚至使用什么编程语言都不关心。
2023-12-31 11:37:31
488
原创 特征值求解——重启Arnoldi方法和收缩(deflation)技术
Arnoldi向量转换为Schur向量,注意,只作用在新近收敛的向量和下一个初始向量上。注意上面两个算法的区别,Algorithm 2相比1唯一的不同是,循环是从k+1开始的,也就是只改变Vm和Hm的最后m-k列,即active部分。在下一次的arnoldi过程中,只有m-k个arnoldi向量被计算,也就是active vectors。,我们将这个R的子矩阵取出来记为Rk,对应的Q中的前k列取出来记为Qk,那么我们有。注意,S≡Range(Qk)是A的不变子空间,对应着k个特征值,
2023-12-17 15:38:45
743
1
原创 “数据结构”模式之迭代器(Iterator)模式
常常有一些组件在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大地破坏组件的复用。这时候,将这些特定数据结构封装在内部,在外部提供统一的接口,来实现与特定数据结构无关的访问,是一种行之有效的解决方案。典型模式:CompositeIteratorChain of Resposibility1 模式动机在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合...
2023-12-03 21:27:00
105
原创 “接口隔离模式”之外观模式(门面模式)
1 模式动机外观模式属于“接口隔离模式”的一种。下图中,A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?使用B方案的好处:无论系统内部如何变化,对外的接口(Facade)是没有变化的。2 模式定义...
2023-12-03 17:11:00
78
原创 适配器模式
1 模式动机在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象(老接口)的良好实现,同时又能满足新的应用环境所要求的接口?Adapter模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况",在遗留代码复角、类库迁移等方面非常有用。2 模式定...
2023-11-29 23:53:00
66
原创 观察者模式
1 模式动机建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。观察者模式的核心思想是1对多2 模式定义观察者模式(Observer P...
2023-11-26 21:46:00
45
原创 UML模型图之类图——以图书馆管理系统为例
UML模型图中类图是依据系统结构从静态观点描述系统的视图,它定义系统中的对象和类及类之间的关系,以及类的内部结构,即类的属性和操作。通过分析图书管理系统的用例模型和系统功能需求,作为借阅者(Borrower)需要有查书、借书、还书的行为(BorrowerInf),老师(Teacher)和学生(Student)作为借阅者时可借数量不一样,书目标题(Title)作为查找对象也必不可少。它们之间关系...
2023-11-26 21:11:00
8858
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人