太极图形课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种……
作业
可以改改太极图