太极图形课S1第03讲:大规模计算的关键—高级数据结构_哔哩哔哩_bilibili
P1上期回顾
面向过程,面向对象,面向数据
猛的人现在已经可以做这些了:

我还啥也不会。。
习惯了,也不是第一次了……高中的时候也是这样呐。一节数学课完了,周练,别人90我40,习惯了……
这节,主要说如何让代码跑的更快。
P2 高级稠密数据结构
CPU上的算法,强调时间空间复杂度,因为CPU计算的时间占大头
GPU上的算法,并行,计算的时间往往不是大头,内存访问占的时间往往才是大头
简单的说,主要矛盾不同


默认,会进行内存对齐

catch,加速,预取

多维的数据,怎么办?
内存都是1D线性存的,数据在内存里总得有个顺序。
按行存入内存的就是行主序,按列存入内存的就是列主序。

把访问顺序和内存顺序,匹配起来,就快了
存数据的时候,怎么好读就怎么存

那末,怎么存,才好读?
把3*2存成2*3,,这个是什么原理?列主序,按列存到内存里,容易读。

能快,但是麻烦。
这里自动化了一下。
借助了这个root,i表示行,ij的i,


常见的写法

dense:稠密的,描述的是挂的东西的形状
place:对应前面声明的那个field

可以干预怎么存了
这个图画的挺好的……要挂N行,这N行得挂在N列上,正好相互垂直。

按需定义
不用颠倒了,自动优化

还可以接着套娃

1D数据分组

按块存了,但仍可以按1D的来

还可以这么用,这么挂

调用方式都一样

为啥要有这个东西?
有的时候会用到邻域,比如模糊,锐化,高斯模糊。行主序,列主序,都不咋合适, 块主序最合适。

之前提过的俩种方式

哪个更快呢?取决于如何访问,如何运用

在Taichi里,这么写

有时候,不知道这俩谁好,可以试,没啥成本

实际运用

组织数据的时候,相关的,放在一起,容易命中,就比较快。
可以套娃套很多

P3 高级稀疏数据结构
稀疏矩阵,空的还占空间,就浪费了

比如这样的:

可能大部分都是0,就浪费了

引入指针,省空间

定义的时候改一点就能实现这个了

访问的时候,会自动跳过没有值的稀疏的没激活的部分

也有问题,64位的指针,有时候比数据占的空间都大,可能会更慢

怎么办?接着改,引入bitmask

for循环,自动跳过

一些手动操作方式,手动激活,不激活什么的

有层级的1D数据

还可以构造这个:

还可以按层,搞出一个旋转的稀疏太极,最下面一层是pixel

高级数据结构

这个来自paper……不止这4种……

作业
可以改改太极图

本课程介绍了高级数据结构在提高代码运行效率方面的重要性,包括稠密与稀疏数据结构的不同应用场景及优化技巧,如内存对齐、预取等,并探讨了如何针对不同需求选择合适的数据存储方式。

被折叠的 条评论
为什么被折叠?



