C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型从稀疏数据结构到量化数据类型 by 彭于斌( @archibate ) 往期录播: https://www.bilibili.com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 面向人群:图形学、 CFD 仿真、深度学习编程人 员 第 0 章:稀疏矩阵 稠密数组存储矩阵 用 foreach 包装一下枚举的过程 改用 map 来存储 分离 read/write/create 三种访问模式 foreach 直接给出当前坐标指向的值 改用 unordered_map 来存储 unordered_map 手动 read(i, j) 也一样速度 索性把坐标和值打包成 tuple html 按行压缩( Compressed Row Storage ) http://www.netlib.org/linalg/html_templates/node91.html 第 1 章:稀疏网格 稠密网格计算粒子经过的格点数量 改用更小的 char 存储 只用一个 bit 存储,一个 char 可以存储 8 个 bit 用 map 来存储 读取:如果不存在,则读到 0 写入:如果不存在,则创建该表项0 码力 | 102 页 | 9.50 MB | 1 年前3
 MoonBit月兔编程语言 现代编程思想 第七课 命令式编程:命令,可变数据结构,循环val val mut ref = { val : 1 } ref = { val : 10 } ref ref 1 1 val val 10 val 9 别名 指向相同的可变数据结构的两个标识符可以看作是别名 1. fn alter(a: Ref[Int], b: Ref[Int]) { 2. a.val = 10 3. b.val = 20 4. } 5. 6. val : 1 } 8. alter(x, x) 9. println(x.val.to_string()) // x.val的值将会被改变两次 10. } 10 别名 指向相同的可变数据结构的两个标识符可以看作是别名 x val 1 alter(x, x) a init b x val 10 alter(x, x) a init b x val 20 alter(x ⽉兔也会检查函数返回结果是否与类型声明相同,可以避免错误的返回类型声明 21 可变数据 使⽤场景⼴泛 直接操作程序外环境,如硬件等 ⼀些情况下性能更好,如随机访问数组等 可以构建部分复杂数据结构,如图 重复利⽤空间(原地修改) 可变数据并不总是与引⽤透明性冲突 1. fn fib_mut(n: Int) -> Int { // 对于相同输⼊,总是有相同输出 2. let mut0 码力 | 23 页 | 780.46 KB | 1 年前3
 2022年美团技术年货 合辑Outbrain 比赛介绍详情 [26]。参赛选手会面对以下两个 重要挑战: ● 异构性:平台提供需求方平台(DSP)广告投放服务,涉及到用户在数千个异 质站点上的行为刻画。 ● 超高维稀疏性:特征高维稀疏,数据规模庞大,包含了 7 亿个用户、20 亿次 浏览记录。 基于多层级多因子的模型融合方案:针对本次赛题的挑战,我们队采用了基于多层级 多因子的模型融合方案来进行建模。一方面对于异构站点行为,单一模型不易于全 站点行为,单一模型不易于全 面刻画,另一方面,亿级别的数据规模给多模型的分别优化带来了较大的空间。由 于 FFM 具有强大的特征交叉能力以及较强的泛化能力,能更好地处理高维稀疏特征。 因此,我们选择该模型作为融合基模型的主模型。模型融合通过不同模型学习到有差 异性的内容,从而有效挖掘用户在不同站点上的异质行为。模型融合的关键是产生并 结合“好而不同”的模型 [3][4]。基于多层级多因子的模型融合方案首先通过模型差异 分,许多显示交叉特征如用户商品点击率等往往有较强的业务意义,让模型直接感知 组合好的特征往往比自动学习特征间的关系更为简单;第三方面对于许多高维度稀疏 ID 特征,如亿级别以上的推荐或广告场景中,DeepFM、DeepFFM 对于这些特征 的学习很难充分,自动化特征工程能给这些稀疏 ID 构造很强的特征表示。 算法 < 55 3.3 自动化模型优化 图 15 自动化模型优化 基于重要度的网格搜索:在我0 码力 | 1356 页 | 45.90 MB | 1 年前3
 Julia 中文文档. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 42 集合和数据结构 471 42.1 迭代 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 序列化 1095 83 共享数组 1097 84 套接字 1099 85 稀疏数组 1105 85.1 压缩稀疏列 (CSC) 稀疏矩阵存储 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1105 85.2 稀疏向量储存 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106 85.3 稀疏向量与矩阵构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1106 85.4 稀疏矩阵的操作 . . . . . . . . . . . . . . . . . . . . . . .0 码力 | 1238 页 | 4.59 MB | 1 年前3
 机器学习课程-温州大学-01机器学习-引言的目录,这样在之后的使用过程 中减少一些莫名的错误。 Python 的环境的安装 54 Python 的主要数据类型 ⚫字符串 ⚫整数与浮点数 ⚫布尔值 ⚫日期时间 ⚫其它 55 Python 的数据结构 ⚫列表(list) 用来存储一连串元素的容器,列表用[ ]来表示,其中元素的类型可不相同。 ⚫元组(tuple) 元组类似列表,元组里面的元素也是进行索引计算。列表里面的元素的值可以修改,而元组 : 1、一个强大的N维数组对象Array; 2、比较成熟的(广播)函数库; 3、用于整合C/C++和Fortran代码的工具包; 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy 配合使用更加方便。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、 矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融 函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分 析环境的重要因素之一。 63 Python模块-Pandas ⚫ 基本数据结构 Series 一维数据结构,包含行索 引和数据两个部分 DataFrame 二维数据结构,包含 带索引的多列数据, 各列的数据类型可能 不同 64 Python模块-Pandas ⚫ 数据索引 df[5:10] 通过切片方式选取多行0 码力 | 78 页 | 3.69 MB | 1 年前3
 机器学习课程-温州大学-01深度学习-引言的目录,这样在之后的使用过程 中减少一些莫名的错误。 Python 的环境的安装 55 Python 的主要数据类型 ⚫字符串 ⚫整数与浮点数 ⚫布尔值 ⚫日期时间 ⚫其它 56 Python 的数据结构 ⚫列表(list) 用来存储一连串元素的容器,列表用[ ]来表示,其中元素的类型可不相同。 ⚫元组(tuple) 元组类似列表,元组里面的元素也是进行索引计算。列表里面的元素的值可以修改,而元组 : 1、一个强大的N维数组对象Array; 2、比较成熟的(广播)函数库; 3、用于整合C/C++和Fortran代码的工具包; 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy 配合使用更加方便。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、 矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融 函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分 析环境的重要因素之一。 64 Python模块-Pandas ⚫ 基本数据结构 Series 一维数据结构,包含行索 引和数据两个部分 DataFrame 二维数据结构,包含 带索引的多列数据, 各列的数据类型可能 不同 65 Python模块-Pandas ⚫ 数据索引 df[5:10] 通过切片方式选取多行0 码力 | 80 页 | 5.38 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 07 深入浅出访存优化宽。三级缓存也装不下,那就取决于主内存 的带宽了。 • 结论:要避免 mem-bound ,数据量尽量足 够小,如果能装的进缓存就高效了。 L2: 256 KB L3: 12 MB 缓存的工作机制:读 • 缓存中存储的数据结构: • struct CacheEntry { • bool valid; • uint64_t address; • char data[64]; • }; • CacheEntry 0x0048~0x0050 这 4 个字节时,实际会导致 0x0040~0x0080 的 64 字节数据整个被读取到缓存中。 • 这就是为什么我们喜欢把数据结构的起始地址和大小对齐到 64 字节,为的是不要浪费缓存行的存储空间。 缓存的工作机制:写 • 缓存中存储的数据结构: • struct CacheEntry { • bool valid, dirty; • uint64_t address; 结论:访问内存的用时,和访问的字节数 量无关,和访问的每个字节所在的缓存行 数量有关。 • 可见,能否很好的利用缓存,和程序访问 内存的空间局域性有关。 缓存行决定数据的粒度(续) • 所以我们设计数据结构时,应该把数据存 储的尽可能紧凑,不要松散排列。最好每 个缓存行里要么有数据,要么没数据,避 免读取缓存行时浪费一部分空间没用。 重新认识结构体 重新认识 AOS *0 码力 | 147 页 | 18.88 MB | 1 年前3
 4. ClickHouse在苏宁用户画像场景的实践用户id,只需要40亿bit位, 约477m大小 = (4 * 109 / 8 / 1024 / 1024) 但是如果使用上述的数据结构存储单独一个较大数值的数字id,会造成空间上的浪费,例如 仅存储40亿一个数值也需要477m的空间。也就是说稀疏的Bitmap和稠密的占用空间相 同。通常会使用一种bitmap压缩算法迚行优化。 RoaringBitmap是一种已被业界广泛使用的 Container  Run Container  Bitmap Container 10 RoaringBitmap原理介绍 11 丌仅数据结构设计精巧,而且还有 很多高效的Bitmap计算函数。 稀疏数据,劢态分配 最大存储:4096元素 最大空间:8KB 连续数据,劢态分配 最大存储:65536元素 最大空间:128KB 稠密数据,固定大小 最大存储:65536元素0 码力 | 32 页 | 1.47 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 02 现代 C++ 入门:RAII 内存管理被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 专题: wrap 调度,共享内存, barrier 9.并行算法实战: reduce , scan ,矩阵乘法等 10.存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 构函数 ,那么这个类就不需要担心。 • 因为如果用到了自定义解构函数,往往意味着你的类 成员中,包含有不安全的类型。 • 一般无外乎两种情况: 1. 你的类管理着资源。 2. 你的类是数据结构。 管理着资源:删除拷贝函数,然后统一用智能指针管理 • 这个类管理着某种资源,资源往往不能被“复制”。比如 一个 OpenGL 的着色器,或是一个 Qt 的窗口。 • 如果你允许 GLShader shared_ptr来管理,省的每个类实 现一遍原子引用计数器。 管理资源的类, 请删除他的拷贝 是数据结构:如果可以,定义拷贝和移动 • 这个类是你精心设计的数据结构,包括我们刚 刚发明的 Vector ,还有链表,红黑树等。如 果这些数据结构是可以支持拷贝的(比如 Vector 就可以),你可能需要自己一个个定义。 如果不支持,那就删除( = delete )。 0 码力 | 96 页 | 16.28 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 05 C++11 开始的多线程编程被忽视的访存优化:内存带宽与 cpu 缓存机制 8.GPU 专题: wrap 调度,共享内存, barrier 9.并行算法实战: reduce , scan ,矩阵乘法等 10.存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 相比普通的 std::mutex 有一定性能损失。 • 同理还有 std::recursive_timed_mutex , 如果你同时需要 try_lock_for() 的话。 第 5 章:数据结构 案例:多线程环境中使用 std::vector • 刚才说了, vector 不是多线程安全的容器 。 • 多个线程同时访问同一个 vector 会出现 数据竞争( data-race owns_lock() 判断等,同学们自己研究 。 只需一次性上锁,且符合 RAII 思想:访问者模式 Accessor 或者说 Viewer 模式,王鑫磊常用于设计 GPU 容器 OpenVDB 数据结构的访问,也是采用了 Accessor 的设计…… 并且还有 ConstAccessor 和 Accessor 两种,分别对应于读和 写 同学们可以想想看,如果这里的 m_mtx 改成读写锁 ,要如何实现0 码力 | 79 页 | 14.11 MB | 1 年前3
共 383 条
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 39
 













