- 博客(141)
- 收藏
- 关注

原创 从微架构到向量化--CPU性能优化指北
无论是CPU还是GPU,基本的并行手段主要有三种:(1) instruction-level parallelism (ILP) 指令并行 如超标量、流水线(在GPU中叫做流水线并行)(2) thread-level parallelism (TLP) 如openmp 和 pthread (在GPU中叫数据并行或者SIMT)(3) vector-level parallelism 如SIMD(在GPU中叫张量并行)
2024-08-02 09:09:09
1472
原创 数据检索:倒排索引加速、top-k和k最邻近
之前在《Elasticsearch: 非结构化的数据搜索》我们看了ES的设计,主要侧重于它分布式的设计以及LSM-Tree,今天我们来关注算法部分:如何进行检索算法的设计以及如何加速倒排索引。然后看看topk的面试热门题如何解决。
2024-08-11 00:12:06
1117
原创 Elasticsearch: 非结构化的数据搜索
聚合是在ES中实现的,而非Lucene。· Query和Fetch请求之间是无状态的,除非是scroll方式。· 分页搜索不会单独“cache”,cache和分页没有关系。· 每次分页的请求都是一次重新搜索的过程,而不是从第一次搜索的结果中获取。看上去不太符合常规的做法,事实上互联网的搜索引擎都是重新执行了搜索过程:人们基本只看前几页,很少深度分页;重新执行一次搜索很快;如果缓存第一次搜索结果等待翻页命中,则这种缓存的代价较大,意义却不大,因此不如重新执行一次搜索。
2024-08-11 00:10:15
1061
原创 Problem-Based Learning - LevelDB&RocksDB
同样的道理,当中等文件数量达到一定阈值,这些文件将被 compaction 成大文件,这种方式不断递归,会持续生成越来越大的文件。当 L1 的文件数量达到阈值时,会选取 L1 中的一个 sst 与 L2 中的多个文件做合并,假设 L1 有 10 个文件,那么一个文件便占 L1 数据量的 1/10,假设每层包含的 key 范围相同,那么 L1 中的一个文件理论上会覆盖 L2 层的 10 个文件,因此会选取 L1 中的一个文件与 L2 中的 10 个文件一起 compaction,将生成的新文件放到 L2;
2024-08-11 00:07:25
1264
原创 Problem-Based Learning - MySQL
结构B+树的磁盘读写代价低,更少的查询次数,查询效率更加稳定,有利于对数据库的扫描B+树是B树的升级版,B+树只有叶节点存放数据,其余节点用来索引。索引节点可以全部加入内存,增加查询 效率,叶子节点可以做双向链表,从而提高范围查找的效率,增加的索引的范围假设主键 ID 为 bigint 类型,长度为 8 字节,而指针大小在 InnoDB 源码中设置为 6 字节每页能存放的指针数:161024/(8+6)每页数据条数:163层数据条数: 11701170大约2000w条。
2024-08-11 00:03:50
660
原创 Problem-Based Learning - 操作系统
首先,内核2.6版本之后的WQ_FLAG_EXCLUSIVE规定了socket fd指向的等待队列的行为为一次只唤醒一个。但是如果epoll_create在fork之前,因为实际的进程唤醒在socket回调中,那么仍然会导致惊群。Nginx提供了三种解决方案:利用SO_REUSEPORT worker监听相同ip/port,内核提供自动负载均衡的多个listener(等待队列),可以实现每次只唤醒一个进程利用WQ_FLAG_EXCLUSIVE,只要不共享epfd,那就不会惊群。
2024-08-11 00:02:43
831
原创 Problem-Based Learning - 算法
*先后调用函数生成两个数,易知生成10、01的概率都是一样的,那么规定这两个一个为一一个为0即可,如果生成了11或者00那么再调用直到生成10/01为止 **说一说红黑树的插入操作?(插入根节点为黑,其余为红)
2024-08-10 23:58:39
454
原创 Spark: a little summary
父RDD和子RDDpartition之间的关系是一对一的,或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的,**不会有shuffle产生。**父RDD的一个分区去到了子RDD的一个分区**宽依赖**父RDD与子RDD partition之间的关系是一对多,
2024-08-02 09:26:44
375
原创 Problem-Based Learning - 网络&Linux调优
我们通常用带宽、吞吐量、延时、PPS(Packet Per Second)等指标衡量网络的性能。给定一个端口号,比方说80吧,怎么查看占用这个端口的外部ip,输出前五个?netstat查看网络连接数量?netstat(能查看tcp udp等) lsof。
2024-08-02 09:22:22
1025
原创 Problem-Based Learning - 分布式和一致性
不会。Leader 在任期内会周期性向其他 follower 节点发送心跳来维持地位。follower 如果发现心跳超时,就认为 leader 节点宕机或不存在。随机等待一定时间后,follower 会发起选举,变成 candidate,然后去竞选 leader。如果主仲裁一致写入但是没有回复成功的时候挂了怎么办加消息序列号,如果已经写入直接返回成功raft不依赖墙上时钟,而是使用逻辑日志解决选举时间设置为随机的150ms到300ms之间,为了尽量避免产生多个candidate的情况。
2024-08-02 09:18:42
637
原创 Problem-Based Learning - 数据检索&ES&OLAP&CK和Calcite
(2) thread-level parallelism (TLP) 多核并行 如openmp 和 pthread (在GPU中叫数据并行或者SIMT)文件结构都是下面这种表示,termFreqs中存储的是文档id和词频(压缩二元组),skipdata用于加速文档id的查找。.doc后缀文件:记录 Postings 的 docId 信息和 Term 的词频。两个相同大小的矩阵,a[i][j] = a[i][j]怎么优化?**ES检索的过程是怎样的?先处理128位或者512位不对齐的部分,再处理剩下的部分。
2024-08-02 09:16:10
540
原创 Problem-Based Learning - C++
如何定义一个只能在堆上(栈上)生成对象的类?只能在堆上方法:将析构函数设置为私有原因:C++ 是静态绑定语言,编译器管理栈上对象的生命周期,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性。若析构函数不可访问,则不能在栈上创建对象。只能在栈上方法:将 new 和 delete 重载为私有原因:在堆上生成对象,使用 new 关键词操作,其过程分为两阶段:第一阶段,使用 new 在堆上寻找可用内存,分配给对象;第二阶段,调用构造函数生成对象。
2024-08-02 09:11:31
445
原创 MIT 6.172 笔记 & 现代硬件算法案例分析
后面的两节都是选修课,因为有很多优秀的实现,比如mimalloc、tcmalloc,我之前也分析过,所以这节就跳过了,我们看下一节,lock free和wait free,这个还是很重要的。在不完全遵循SPMD计算模式的不规则多物理应用中,如在紧密耦合的流体颗粒系统中遇到的那样,OpenMP的灵活性可以比MPI具有很大的性能优势。如果划分的块比较小,那就不会用失败率比较高的cmpxchg,而是用__sync_fetch_and_add。增量并行:可以一次处理程序的一个部分,不需要对代码进行显著的更改。
2024-04-27 20:56:30
1534
原创 数据检索:倒排索引加速、top-k和k最邻近
之前在《Elasticsearch: 非结构化的数据搜索》我们看了ES的设计,主要侧重于它分布式的设计以及LSM-Tree,今天我们来关注算法部分:如何进行检索算法的设计以及如何加速倒排索引。然后看看topk的面试热门题如何解决。
2024-02-16 13:39:50
1483
原创 Elasticsearch: 非结构化的数据搜索
聚合是在ES中实现的,而非Lucene。· Query和Fetch请求之间是无状态的,除非是scroll方式。· 分页搜索不会单独“cache”,cache和分页没有关系。· 每次分页的请求都是一次重新搜索的过程,而不是从第一次搜索的结果中获取。看上去不太符合常规的做法,事实上互联网的搜索引擎都是重新执行了搜索过程:人们基本只看前几页,很少深度分页;重新执行一次搜索很快;如果缓存第一次搜索结果等待翻页命中,则这种缓存的代价较大,意义却不大,因此不如重新执行一次搜索。
2024-02-08 11:15:27
1782
原创 Nginx: a little source code
Nginx被称为C++程序员必学的源码之一,我觉得名副其实,它的事件机制、内存管理、进程通信都可以说是顶级实践,非常值得学习。Nginx源码比较多,本文只看几个重要的模块,更详细的内容请参考《深入理解nginx模块开发与架构》,这本书内容很全,本文只能是跟在后面做一点东施效颦的解读了。
2024-02-05 21:27:50
985
原创 secretflow推理服务源码解读
model_bundle是一个proto定义, 包含了完整的模型信息。GraphDef是执行图的定义,包括了一组携带数据的节点信息(NodeDef)和一组图的执行信息(ExecutionDef)。// 节点OP的属性// INT// FLOAT// STRING// BOOLbool b = 6;
2024-01-24 19:29:40
257
原创 olap/clickhouse keeper 一致性协调服务
在《Redis集群:分布式的less is more》中我提到,无论是啥服务,想要达到操作视角的强一致性,要么使用类似TSO/原子钟的方案,要么有一套一致性协调服务。clickhouse最初是用zookeeper的,在 21.8 版本中开始引入了 ClickHouse-Keeper ,直至 ClickHouse 21.12 发布公告提到 ClickHouse Keeper 功能基本完成。
2024-01-20 11:54:00
1629
原创 brpc: a little source code
之前在《olap/clickhouse-编译器优化与向量化》中我谈过brpc的汇编控制bthread。本文就来看一下brpc作为一个高性能的rpc实现,除了自定义线程栈之外,代码还有什么优秀之处。因为时间原因,本文不做深入分析,只是解读下几个有意思的模块。
2024-01-13 00:03:51
956
原创 olap/spark-tungsten:codegen
15721这一章没什么好说的,不再贴课程内容了。codegen和simd在工业界一般只会选一种实现。比如phothon之前用codegen,然后改成了向量化引擎。一般gen的都是weld IR/LLVM IR/当前语言,gen成C++的也要检查是不是有本地预编译版本,要不没法用。因为clickhouse没有codegen,这节课就拿我比较熟悉的spark的tungsten来当例子,tungsten会gen成scala,然后拿janino动态编译。
2024-01-07 13:17:51
1125
原创 从《数据库索引设计与优化》看mysql索引设计
对于INSERT_SELECT型数据库,如果没有事务的要求,更倾向于选择MyISAM。下面两个图可以说明聚集索引和非聚集索引的结构。如果业务需要事务、外键、crash-safe能力,那就应当选择InnoDB。
2024-01-05 17:09:56
573
原创 olap/clickhouse-存储
Dremel 格式的设计目的就是按列来存储 Protobuf 的数据。由于 repeated 字段的存在,这要比按列存储关系型的数据困难一些。一般的思路可能是用终止符表示每个 repeat 结束,
2023-12-24 16:48:01
1391
原创 olap/clickhouse-编译器优化与向量化
本文主要结合15721和clickhouse源码来聊聊向量化,正好我最近也在用Eigen做算子加速,了解下还是有好处的。
2023-12-17 18:44:27
2339
原创 ptmalloc:从内存虚拟化说起
本文并不局限于ptmalloc的原理,而是从linux的内存虚拟化和系统调用原理出发,结合各种语言实现,讲明内存分配方面的trade off,力图事无巨细,追根究底。本文内容包括但不限于:NIO原理、0拷贝原理、内存虚拟化、GC和内存分配、PCB结构、mmap原理和场景、JVM内存分配细节、缺页异常中断、PTE、物理页分配、驻留内存、malloc分配原理、ptmalloc的设计和缺陷、mimalloc设计。glibc提供了一组在所有Linux发行版上都可用的标准化函数。
2023-12-10 19:14:47
487
原创 Redis集群:分布式的less is more
(Chain Replication with Apportioned Queries: 读均摊的链式复制) 这篇论文对于上述问题进行了改进,同时还提供了weak consistency的支持,在低一致性需求的workload下提高性能。思考:链式同步和半同步各有什么优劣?为什么现在都不使用无主复制了?
2023-12-10 19:13:01
562
原创 SQL编译优化原理
RuleQueue 是一个优先队列,包含当前所有可行的 RuleMatch,findBestExpr() 时每次循环中我们从中取出优先级最高的并 apply,再根据 apply 的结果更新队列……普通的逻辑树都是从叶子节点往根结点执行的,但是CorreltedJoin的右子树会被带入左子树的行的值反复的执行。这种方法可以避免对无关的子查询和计划进行搜索,从而提高查询优化的效率。Program:一个SQL查询解析和优化的过程集合,可以将多个子过程组合在一起,以便进行SQL查询的解析和优化。
2023-07-29 09:27:30
599
原创 来点八股文(二) 文件IO
stat返回与此命名文件有关的信息结构,fstat获得已在描述符fieldes上打开的文件信息,lstat类似于stat,但是当文件是一个符号链接时,返回该符号链接的有关信息。如果文件偏移量大于当前文件长度,对于文件的下一次写将会延长该文件,并且形成一个空洞,对于文件中没有写过的字节都被读为0。若一个文件用lseek被定位到文件当前的尾端,则文件表项中的当前文件位移量被设置为i节点表项中的当前文件长度。虚拟的文件路径,每个进程各有一个,打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的)。
2023-04-09 22:50:31
493
原创 A Little Scala, A Few Types
and名字(Names,Scope,Bindings)、控制流(control flow)、类型系统和复合类型(type system and composite types)、子程序和控制抽象(subroutines and control abstraction)、数据抽象和面向对象(data abstraction and object orientation)是PL(Programming Language)的核心特性(Feature)。了解任何一种语言都要学习它所提供的这些特性。
2023-04-07 13:33:00
607
翻译 [openjdk][翻译]为类型擦除辩护
…(同构的泛型)这种方式具有一个强大的优势,这个优势无法由其他方法获得,那就是:逐步迁移的兼容性。这是一种不破坏现有的源代码或二进制类文件的情况下,把非泛型类兼容的转换为泛型类的能力”
2022-10-23 02:12:34
270
原创 [PLT] Programming Lanaguage Features
代数数据类型借鉴了代数学中的概念,作为一种函数式数据结构,体现了函数范式的数学意义。通常,代数数据类型不包含任何行为。它利用和类型(Sum Type)来展示相同抽象概念的不同组合,使用积类型(Product Type)来展示同一个概念不同属性的组合。
2022-10-17 23:47:14
473
转载 [转]编码字符集(Unicode、UCS)和字符集编码(UTF-8、UTF-16、UTF-32)以及surrogates、code point和code unit
今天看到一篇特别好的文章,转发一下。原链接:http://www.360doc.com/content/12/0420/13/9470897_205152817.shtml简单来说:Unicode和UCS都是编码字符集,而UTF-8、UTF-16、UTF-32指的是字符集编码,至于GB2312,GBK 指的既是编码字符集也是字符集编码。所谓surrogates,是UTF-16在编码时采用的一种方案:补充字符使用两个char型变量来表示,这两个char型变量就组成了所谓的surrogate pair(在底层
2022-10-17 14:13:44
1083
原创 Basic Category Theory 基本猫论
algebraic topology researchers们发现,在定义“natural tranformation”之前,必须定义“functor”,在定义“functor”之前,必须定义“category”(在范畴论中的幺半群其实就是用morphism重新定义结合律(笛卡尔积)和单位元的过程,在范畴论中,笛卡尔积等同于product,单位元等同于terminal)环(ring)被认为有乘法单位元(multiplicative idenetity),环的同态则被认为保持乘法单位元的性质。
2022-10-15 23:48:27
720
原创 [计算模型]%90的银弹
抽象原则是对于人类等思维能力有限的智能体来说,最成功的系统构建原则。它将所有系统分解为两个部分:规范和实现。区别规范/实现的是,规范通常比实现更容易理解。系统应该具有哪些属性才能最好地支持抽象原则?Encapsulation 封装。封装应该可以隐藏零件的内部。Compositionality 组合性。应该可以组合部件来制造新部件。Instantiation/invocation 实例化/调用。可以基于单个定义创建零件的多个实例。这些实例在创建时“插入”到它们的环境中。
2022-10-08 00:16:26
371
原创 [PLT] 概念笔记
在对象变量上取值的变量称为元变量,不含自由变量的项称为封闭项,封闭项也称为组合子,最简单的组合子称为恒等函数 id = lambdax(x)只输出其变元。纯lambda演算是图灵完备的,为了解决结果的发散问题,有两种方案,第一种使用项的类型注释来显式检查类型的结果,第二种是使用类型检查器自己推导或者重构这个信息。给定语言中能够使用类型系统消除的错误一般称为运行时类型错误runtime type error,一般的类型系统相对直接的检查能够校验简单的类型错误和数组越界。操作语义(将语言视为抽象的自动机)...
2022-08-08 17:16:17
390
原创 [Machine Learning] Programming Exercise 1: Linear Regression
吴恩达机器学习课后作业。因为这学期内容不全,所以用的往年的题目。
2022-07-05 14:36:29
286
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人