/hw10

Primary LanguageC++

高性能并行编程与优化 - 第10讲的回家作业

从稀疏数据结构到量化数据类型

  • 稠密数组存储矩阵
  • 用 foreach 包装一下枚举的过程
  • 分离 read/write/create 三种访问模式
  • 改用 unordered_map来存储
  • unordered_map 手动 read(i, j) 也一样速度
  • 把坐标和值打包成 tuple,存储在 vector
  • map 基于红黑树,会按照键值排序,需要键值具有 operator< 重载,复杂度 O(logn) C++11 新增的 unordered_map 基于哈希表,不保证顺序但更高效,需要键值能被哈希,复杂度 O(1)
  • unordered_map 作为顶层,指针作为中层,稠密数组作为底层
  • OpenVDB 的稀疏体积,可以存储符号距离场(SDF),也可以存储烟雾仿真的结果等
  • 操作系统管理内存的最小单位:页(4KB)
  • 配合莫顿分块,AOSOA等第七课的技术,就得到SPGrid(sparse-paged grid)
  • SPGrid 的利弊
  • 优点:平坦直观,适合插桩,顺序访问,自适应网格
  • 缺点:尺寸受限,操作系统挂钩,依赖 x86 硬件机制

评分规则

  • 完成作业基本要求 50 分(详见下方"作业要求")
  • 能够在 ANSWER.md 中用自己的话解释 25 分
  • 代码格式规范、能够跨平台 5 分
  • 有自己独特的创新点 20 分
  • 明显抄袭现象 -100 分

作业要求

修改 main.cpp,改良其中的康威生命游戏模拟器(使用稀疏数据结构,高效利用内存),回答注释中的问题,并保证输出的答案正确。

测试的结果和你的优化思路,请填到 ANSWER.md。

温馨提示:如果用了 IDE,记得统一开启 Release 模式来比较性能。

关于内卷

如果你自己实现了哈希表而没有用标准库,或是结合第七课知识用了 _mm_stream_ps,或是用了莫顿序分块的,用了局部数组实现 loop fusion: 只要是在 满足作业要求的基础 上,这是件好事! 老师会酌情加分,视为“独特的创新点”,但最多不超过 20 分。