C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化AOSOA 。 • 缺点是必须保证数量是 1024 的整数倍, 而且因为要两次指标索引,随机访问比较 烦。 • 这里的 1024 并非随意选取,而是要让每 个属性 SOA 数组的大小为一个页 ( 4KB )才能最高效,原因稍后会说明。 AOSOA :注意,内部 SOA 的尺寸不宜太小 如果内部 SOA 太小,内部循环只有 16 次连续的读 取, 16 次结束后就会跳跃一段,然后继续连续的 等待数据抵达前空转浪费时间。 页对齐的重要性 • 为什么要 4KB ?原来现在操作系统管理内存是用分页 ( page ),程序的内存是一页一页贴在地址空间中的, 有些地方可能不可访问,或者还没有分配,则把这个页设 为不可用状态,访问他就会出错,进入内核模式。 • 因此硬件出于安全,预取不能跨越页边界,否则可能会触 发不必要的 page fault 。所以我们选用页的大小,因为本 来就不能跨页顺序预取,所以被我们切断掉也无所谓。 来就不能跨页顺序预取,所以被我们切断掉也无所谓。 • 另外,我们可以用 _mm_alloc 申请起始地址对齐到页边 界的一段内存,真正做到每个块内部不出现跨页现象。 手动预取: _mm_prefetch • 对于不得不随机访问很小一块的情况,还可以通过 _mm_prefetch 指令手动预取一个缓存行。 • 这里第一个参数是要预取的地址(最好对齐到缓存 行),第二个参数 _MM_HINT_T0 代表预取数据0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型https://yuanming.taichi.graphics/publication/2021-quantaichi/quantaichi.pdf ← ??? 第 7 章: SPGrid 操作系统管理内存的最小单位:页( 4KB ) • 当调用 malloc 时,操作系统并不会实际分配那一块内存,而是将这一段内存标记为“不可 用”。当用户试图访问(写入)这一片内存时,硬件就会触发所谓的缺页中断( page fault 的内存。等到用户访问了 a[1024] ,也就是触及了下一个页面,他才 会继续分配一个 4KB 的页面,这时才 8KB 被实际分配。比如这里我们分配了 16GB 内 存,但是只访问了他的前 4KB ,这样只有一个页被分配,所以非常快。 实验:那如果分配超过机器内存容量的空间会怎样 • 既然是操作系统的内存是惰性分配给用户程 序的,分块大小就是 4KB ,那么是不是可 以利用这一点实现稀疏? • 而当我们试图用 sys/mman.h 头文件里。 • Windows 可以用 VirtualAllocateEx 之类。 • mmap 出来的起始地址保证是对齐到 4KB 的,读写访问其 中偏移地址时,会按页的粒度自动分配和释放内存,从而满 足稀疏数据结构“按需分配”的需求。且由于分页是硬件自动 来做的,比我们软件哈希和指针数组的稀疏更高效,写起来 就和普通的二维数组没什么两样,就好像顺序访问。也用不0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化都能把等差数列求和优化成 5050 的编译器笑着看着你,说道:还要你提醒吗? • 所以,如果某“面试官”试图“考考”你 register 和 inline 的所谓“优化技巧”,你直接把小彭 老师这两页 ppt ,贴到他脸上即可。 • 明明实验一下就知道的事,还在照着上世纪谭某强教材念。古有纸上谈兵,今有脑内编程 。 • 计算机编程又不是量子物理广义相对论,我们每个人都有电脑,做一下实验很容易,可总0 码力 | 108 页 | 9.47 MB | 1 年前3
共 3 条
- 1













