C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型unordered_map 来存储 map 基于红黑树,会按照键值排序,需要键值具有 operator< 重载,复杂度 O(logn) C++11 新增的 unordered_map 基于哈希表,不保证顺序但更高效,需要键值能被哈希,复杂度 O(1) 用 unordered_map 按 16x16 分块存储 分块能减少 unordered_map 中存储的表项数量,从而减轻哈 希的压力。但意味着键值在空间上需要具有一定的局域性,否 传统稠密二维数组 无边界稀疏分块哈希表 有了无边界的稀疏网格,再也不用担心二维数组要分配多大了。 坐标可以无限延伸,甚至可以是负数!比如 (-1,2) 等…… 他会自动在写入时分配 16x16 的子网格,称之为叶节点 (leaf node) ,而这里的 unordered_map 就是充当根节点 (root node) 。 图片解释稀疏的好处 传统稠密二维数组 无边界稀疏分块哈希表 此外,还是按需 这些被写入的部分被称为激活元素 (active element) ,反之则是未激活 (inactive) 。 这就是稀疏的好处,按需分配,自动扩容。 分块则是利用了我们存储的数据常常有着空间局域性的特点,减轻哈希表的压 力,同时在每个块内部也可以快乐地 SIMD 矢量化, CPU 自动预取之类的。 第 2 章:位运算 稀疏的好处:坐标可以是负数 这样即使坐标为负数,或者可以是任意大的坐标,都不会产生越界错误。0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器k k k k k k k k k k k k v v v v v v setmap 第四章:哈希散列表 高效的查找离不开我 高效的查找离不开我 unordered_set 查找为什么高效 • 为什么哈希散列表 unorered_set 会比线性数组 vector 在查找这一点上更高效? • 你看,我们刚才只判断了 3 次就找到了目标。这还是最坏的情况,最好只需要 unordered_set 是如何在 O(1) 复杂度内找到任意元素的。 • unordered_map 也一样,只不过是在每个 K 后面外挂了一个 V 类型。 • 计算哈希值时只计算 K 的哈希,而 V 不参与哈希,是个旁观者。 • 查找时,不是返回 K ,而是返回他后面挂的 V ,是个冒名者。 • 就是说,苦劳都是 K 的,功劳都是 V 的。就这两点区别,示意图: k k v unordered_set 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化矢量化的话可能还是要 SOA 或 AOSOA ,比如 hw04 那种的。而 “ pos 和 vel 应该用 SOA 分开存”是没问题的。 • 而且 SOA 在遇到存储不是 vector ,而是稀疏的哈希网格之类索引有一定 开销的数据结构,可能就不适合了。这就是为什么王鑫磊最喜欢 AOSOA :在高层保持 AOS 的统一索引,底层又享受 SOA 带来的矢量化 和缓存行预取等好处……就是随机索引比较麻烦。 他附近的 64 字节都被读取到缓存了,但实际只用到了其中 4 字节,之 后又没用到剩下的 60 字节,导致浪费了 94% 的带宽。 • 虽说连续、顺序访问是最理想的,然而在使用哈希表等数据结构中,不 可避免的会通过哈希函数得到随机的地址来访问,且 Value 类型可能小 于 64 字节,浪费部分带宽。怎么办? 解决:按 64 字节分块地随机访问 • 解决方法就是,把数据按 64 字节大小分块。随0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器一样。虽然你可能注意到这 里的刚好和插入的顺序相反 ?巧合而已,具体怎么顺序 是和 glibc 实现有关的。 • set 基于红黑树实现,相当 于二分查找 树, unordered_set 基于散 列哈希表实现,正是哈希函 数导致了随机的顺序。 不同版本的 set 容器比较 类型 去重 有序 查找 插入 vector × × O(n) O(1) ~ O(n) set √ √ O(logn) O(logn)0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅q; 1 2 3 4 解决 3 :每个线程一个任务队列,做完本职工作后可以认领其他线程的任务 工作窃取法( work-stealing ) 原始的单一任务队列 解决 4 :随机分配法(通过哈希函数或线性函数) • 然而队列的实现较复杂且需要同步机制,还是有一 定的 overhead ,因此另一种神奇的解法是: • 我们仍是分配 4 个线程,但还是把图像切分为 16 份。然后规定每一份按照0 码力 | 116 页 | 15.85 MB | 1 年前3
新一代分布式高性能图数据库的构建 - 沈游人资管计划 / 资金往来 / 担 保 / 借贷 / 集团 / 控股 / 上下 游 ... 父子 / 组合 / 继承 转账 / 大额转账 / 频繁转 账 /... 拥有 拥有 持有 登录 / 连接 已购买 / 意向购 买 / 潜在购买 /... 个人 客户 账户 机构 客户 资产 合约 员工 手机号 设备 商品 商品 查询 / 操作 生活中无处不在的图 图分析技术分类 图查询及其应用场景 图查询 • 使用图数据库的查询语言进行点边的关联查询,可以快速完成传统数据库难以完成的 多度点边关 联 当前图的典型应用场景 路径识别 群体挖掘 节点识别 相似节点 链接预测 连接强度 一致行动人 同事关系 实际控制人 可能认识的人 上下游 同爱好的人 亲属关系 … 人与人、企业与企业、企业与人之间的 复杂、潜在关系推导和挖掘 为已有的分析模型增加“关系特征”维 容灾保障 ( BR ) 元数据层 事务管理 MVOCC 计算层 Cypher AST 优化器 图计算 内存加速引 擎 服务接口 HTTP/RPC Spark 连接器 Python UDF 执行器 索引管理 一致性存储 RAFT 分片管理 元数据 集群管理 用户权限 GNN 应用层 Atlas 图平台 Atlas Studio Atlas0 码力 | 38 页 | 24.68 MB | 1 年前3
谈谈MYSQL那点事MySQL MySQL 配置原则 配置原则 服务优化 服务优化 公共选项 公共选项 选项 缺省值 推荐值 说明 max_connections 100 1024 MySQL 服务器同时处理的数据库连接的最大 数量 query_cache_size 0 ( 不打开 ) 128M 查询缓存区的最大长度,按照当前需求,一 倍一倍增加,本选项比较重要 sort_buffer_size 512K 128M 对于大数据量的查询,尽量避免在 SQL SQL 语句中使用 语句中使用 order by order by 字句,避 字句,避 免 免 额为的开销 额为的开销 采用连接操作,避免过多的子查询,产生的 采用连接操作,避免过多的子查询,产生的 CPU CPU 和 和 IO IO 开销 开销 只关心需要的表和满足条件的数据 只关心需要的表和满足条件的数据 适当使用临时表或表变量0 码力 | 38 页 | 2.04 MB | 1 年前3
基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺生物信息 CNV 分析 • mdsn - A Multi-address DSN(Data Source Name) parser. TDengine 应用开发组 • Python/Rust/Go 连接器 • 数据可视化 • 数据库运维工具 • 第三方数据源接入 • BI 系统接入 https://taosdata.com/ https://github.com/zitsen CONTENTS 高可靠、线性扩展 + 专业技术服务 • 边云数据复制 • 跨云 / 异地数据复制 • 增量备份 • 多级存储 • 工业数据接入 全托管时序数据 管理云服务平台 • 全托管服务 • VPC 对等连接 • 多云部署( AWS/Azure/ GCP) CONTENTS 自 我 介 绍 T D e n g i n e t a o s X R u s t 使 用 taosX - 物联网数据接入问题0 码力 | 29 页 | 2.26 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 Zeno 中一切节点的基类 • 输入输出全部存储在节点的 inputs 和 outputs 成员变量上。 • inputBounds 表示他连接在哪个节点的哪 个端口上,比如 {“PrimitiveCreate”, “prim”} 就表示这个端口连接了 PrimitiveCreate 节点的 prim 输出端口。 • ( zany 是 shared_ptr的缩 写) 0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串string 不可以隐式转换为 const char * (安全起见) • 如果确实需要从 string 转换为 const char * ,请调用 .c_str() 这个成员函数 。 字符串的连接( + 运算符) • C 语言规定,双引号包裹的字符串是 const char * 类型的,他们没有 + 运算 符。 • C++ 为了向前兼容,没办法改变 C 语言的这项规定,只能退而求其次,他另 • “hello” + string(“world”) // 正确 • string(“hello”) + string(“world”) // 正确(推荐) 字符串的连接( + 运算符) • 错误: • 正确: C++14 新特性:自定义字面量后缀 • 不少同学就觉得这样好麻烦,其他语言都是直接 “ hello” 就是字符串类 型, C++ 还得套一层壳 string(“hello”)0 码力 | 162 页 | 40.20 MB | 1 年前3
共 12 条
- 1
- 2













