视频笔记 CppCon 2016 Chandler Carruth High Performance Code 201 Hybrid Data Structures

版权声明:转载请说明出处 http://www.cnblogs.com/eagledai/

https://www.youtube.com/watch?v=vElZc6zSIXM&t=1157s

LLVM internal data structures

LLVM 内部数据结构

2:24 SmallVector

下面是 SmallVector 的简化版本。这是 LLVM 里最基本的数据结构,到处被使用。

问题:为什么不直接使用 STL 的 vector? 因为在 STL 里,如果对 vector 进行 move 操作,按照规范,迭代器还要保持有效。这个特性虽好,但带来的问题是,不能进行 small-size 优化。

4:57 Wield Tricks for SmallVector (SmallVector 的怪异的小把戏)

左边:仅仅有缓存 (char Buffer[])

右边:基类看起来像个 vector,但是没有缓存。缓存是通过基类的构造函数传入的。这种模式是非常强大的,因为类型擦除了 N

类型擦除N的好处?跨越接口边界的时候,不用关心这个N

6.27 SmallDenseSet

It is a smalll size optimized set. Unlike std::unordered_set, instead we use open addressing here, an array of buckets, flat in memory. We use quadratic probing (二次探测). The traits class is related to hashing.

8:40 SmallDenseMap

The map uses the same traits class.

For empty and tombstone buckets, don‘t put complete pair into those buckets. Acutually, just put the keys into them (special code).

LLVM,对于通用的数据机构,99%都是基于以上三个small size optimized containers。

10:37 问题:为什么small size optimized containers不使用allocators?

上图是有人一种建议的实现方式(使用allocators二不是custom containers)。这个solution是能工作的,但是...

问题1:有人可能会忘了让这些数字在所有的callers都同步,否则...booom。也许有办法解决这个问题,但是很难找到简单有效的方法

 

问题2:返回这个vector对象的时候,很有可能这个vector包含memory在stack里面。也许也是有办法解决了,但是很challenging

使用costomed containers,而不是allocators,所有这些问题都消失了。

13:44 Small-size optimizations效果最好,只在values小的时候

works way better when the values are really small. 这是最最critical的!这样才有足够高的密度。所以真正的challenges,是优化这些values,使他们足够小。这比有上面那些containers更重要。Containers不难,但是有效的使用好它们需要很多的工作。

14:45 第一个关键的想法是给large objects address identity

address identity: 对象有内在的ID吗?something unique about the object。如果仔细分配,可以借用地址作为ID

借用地址做ID,可以如上使用container。

问题:为什么不使用forward list?上面的用法比forward list效果好很多!因为地址是连续的,对缓存相对友好。如果遍历forward list,必须先要读出一个对象,才能知道下一个对象的地址在哪里。也就是如果有一次cache miss,就会有一序列的cache misses.

但是以上的用法也有问题,这些大对象本事没有locality。他们内存分配的时候一般都是随意哪里有内存就在哪里,根本没有locality。所以LLVM使用下面可怕的BumpPtrAllocator

20:00 class BumPtrAllocator 简化版本below

"World‘s worst malloc implementation". Nice thing about this:

  • local. strong locality for large objects, though wasteful: a page (4k) at least
  • really fast

21:50 Sometimes, if pointers are too large, use an index

22:08 Aggressively pack the bits

  • to make objects small
  • there are 4 zeros in low bits of the pointer, e.g., 10000000010000000010000

结合之后的提问:这里的bit operations基本上cost非常低,大多都是compile time的cost

28:28 use above packed pointer to build below:

TinyPtrVector can be a T or a vector of T

The most useful case of this is for multi map:

template <typename KeyT, typename ValueT>

using SmallMultiMap = SmallDenseMap<KeyT, TinyPtrVector<ValueT>>;

31:24 Lastly, use bitfields everywhere

32:00 Sometimes, you really need an ordering

不能依赖hash or set的ordering

When possible, sort vectors

有时候,按照什么排序不重要,但一定需要deterministic,也就是需要一个确定的顺序

类似的有 template class SmallMapVector;

可以进一步优化,当数量小的时候,只使用vector, 线性搜索有更高的效率

37:00 提问开始

时间: 2024-08-29 03:00:12

视频笔记 CppCon 2016 Chandler Carruth High Performance Code 201 Hybrid Data Structures的相关文章

视频笔记 CppCon 2015:Marshall Clow “Type Traits - what are they and why should I use them?&quot;

Video: CppCon 2015:Marshall Clow "Type Traits - what are they and why should I use them?" https://www.youtube.com/watch?v=VvbTP_k_Df4 如果你需要写关于不同类型的代码,而不是具体的类型,你可能需要了解Type Traits 4:47 C++多少种类型?14 void, nullptr: 只有一个成员在这个type里面 struct 实际上和class 是一

传z播客 刘意_2015年Java基础视频笔记(day18~)(2016年3月7日00:25:16)

day18 1.Map引入 Map是区分于Collection的另外一个"老大" 作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢? 如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称. 但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗? 针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合 

【读书笔记】2016.12.10 《构建高性能Web站点》

本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 1.1 等待的真相 1.2 瓶颈在哪里 1.3 增加带宽 1.4 减少网页中的HTTP请求 1.5 加快服务器脚本计算速度 1.6 使用动态内容缓存 1.7 使用数据缓存 1.8 将动态内容静态化 1.9 更换Web服务器软件 1.10 页面组件分离 1.11 合理部署服务器 1.12 使用负载均衡 1.1

虚幻4视频笔记002:精简StarterContent文件夹体积

#虚幻4#视频笔记:精简StarterContent文件夹体积 . 在很多练习项目和测试项目中,都会使用StarterContent文件夹,但是该文件夹体积巨大,如果项目数量多会占用大量空间,并且分享起来也很麻烦.这里提供了一种精简体积的简单方法.注意明确视频内容后再对项目进行精简,并且也不要在生产环境中使用这个技巧. 油管: http://t.cn/Rtgk4is 度盘:http://t.cn/Rtgk46v

Android老罗视频笔记-http-1

---恢复内容开始--- 以下是看老罗视频的笔记: (所有图片来自老罗视频的截图) 一.老罗视频教程思路:android入门介绍-->百度地图介绍-->常用UI布局的介绍-->常用的UI的控件.(应用开发控件:HTTP协议编程了解服务器与安卓之间的交互.) 二.WWW是以Internet作为传输媒介的一个应用程序,WWW网上基本的传输单位是Web网页.B-S结构.WWW的工作是基于客户机/服务器计算模型(j2ee).由Web浏览器和Web服务器构成,两者之间采用超文本传输协议HTTP进行

ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法

ng机器学习视频笔记(三) --线性回归的多变量.特征缩放.标准方程法 (转载请附上本文链接--linhxx) 一.多变量 当有n个特征值,m个变量时,h(x)= θ0+θ1x1+θ2x2-+θnxn,其中可以认为x0=1.因此,h(x)= θTx,其中θ是一维向量,θ=[θ0, θ1-θn] T,x也是一维向量,x=[x0,x1..xn] T,其中x0=1. 二.特征缩放(Feature Scaling) 特征缩放的目的,是为了让每个特征值在数量上更加接近,使得每个特征值的变化的影响相对比较"

ng机器学习视频笔记(十二) ——PCA实现样本特征降维

ng机器学习视频笔记(十二) --PCA实现样本特征降维 (转载请附上本文链接--linhxx) 一.概述 所谓降维(dimensionality reduction),即降低样本的特征的数量,例如样本有10个特征值,要降维成5个特征值,即通过一些方法,把样本的10个特征值映射换算成5个特征值. 因此,降维是对输入的样本数据进行处理的,并没有对预测.分类的结果进行处理. 降维的最常用的方法叫做主成分分析(PCA,principal component analysis).最常用的业务场景是数据压

ng机器学习视频笔记(九) ——SVM理论基础

ng机器学习视频笔记(九) --SVM理论基础 (转载请附上本文链接--linhxx) 一.概述 支持向量机(support vector machine,SVM),是一种分类算法,也是属于监督学习的一种.其原理和logistics回归很像,也是通过拟合出一个边界函数,来区分各个分类的结果. 二.代价函数与假设函数 由于svm和logistic很相似,故与logistic进行比较.logistic的代价函数如下: 与logistic不同之处在于,SVM是用两个线段表示logistic中的h.在l

ng机器学习视频笔记(十一) ——K-均值算法理论

ng机器学习视频笔记(十一) --K-均值算法理论 (转载请附上本文链接--linhxx) 一.概述 K均值(K-Means)算法,是一种无监督学习(Unsupervised learning)算法,其核心是聚类(Clustering),即把一组输入,通过K均值算法进行分类,输出分类结果. 由于K均值算法是无监督学习算法,故这里输入的样本和之前不同了,输入的样本只有样本本身,没有对应的样本分类结果,即这里的输入的仅仅是{x(1),x(2),-x(m)},每个x没有对应的分类结果y(i),需要我们