当前位置:   article > 正文

太极图形学——高级数据结构——稠密

太极图形学——高级数据结构——稠密

太极是一个面向数据的编程语言

并行计算的框架下,在计算上花费的时间反而是少数,大量的时间都花在了数据获取(也就是访问内存)上面,这一点在之前的games103课程上也有简单的提及

cpu的计算能力非常强大,而gpu则不同,gpu的优势在于计算的同时进行,我们要提高gpu 的运算效率需要的是如何高效的访问内存

太极语言的快速性提现在两个方面,第一自然就是并行运算,第二则是数据获取的预缓存机制

例如上面这个例子,首先定义了shape之后,在写入数据时并行处理,若是四线程的GPU处理,每一个单位填完第一个数字后(这个数字是从内存中取过来的),还会预缓存一段相邻的数字,这样填后面的数字是直接从缓存中直接取得,访问自然也就变快了

如果是多维数据呢?

首先在内存中数据存储永远是一维的

然而数据访问的模式确是不确定的

我们要将访问数据和内存数据联系起来,我们想要做的是数据访问友好化

那么应该怎么存储数据呢,在C++中我们可以定义不同主序列的矩阵,如下所显示的逻辑,但这样做其实很不方便,需要人工记忆,很容易造成错误

那么在taichi的做法是这样的

  1. x = ti.Vector.field(3,ti.f32,shape=16)#这是定义了一个场,这个场中是16个(1,3)的向量
  2. #ti.root
  3. x = ti.Vector.field(3,ti.f32) #先不给其shape
  4. ti.root.dense(ti.i,16).place(x)#给x定义一个shape

 格式为这样

  1. #转换例子
  2. x = ti.field(ti.f32,shape=())
  3. x = ti.field(ti.f32)
  4. ti.root.place(x)
  5. x = ti.field(ti.f32,shape=3)
  6. x = ti.field(ti.f32)
  7. ti.root.dense(ti.i,3).place(x)
  8. x = ti.field(ti.f32,shape=(3,4))
  9. x = ti.field(ti.f32)
  10. ti.root.dense(ti.ij,(3,4)).place(x)
  11. x = ti.Matrix.field(2,2,ti.f32,shape = 5)
  12. x = ti.Matrix.field(2,2,ti.f32)
  13. ti.root.dense(ti.i,5).place(x)

root出发,挂载的是dense,dense描述的形状,在dense后面挂着的就是那个没定义shape 的field

                          

这样做的好处是可以更进一步的设计数据的结构

例如之前提出的那种矩阵形式的数据,就可以按下面的方式来存贮

这样我们就可以这样定义一个行主序列的field

数据定义好之后,访问反而就很简单了,直接使用for语句就可以了

  1. #以行为主序的field的定义
  2. x = ti.field(ti.f32)
  3. ti.root.dense(ti.i,4).dense(ti.j,4).place(x)
  4. @ti.kernel
  5. def fill():
  6. for i,j in x:
  7. x[i,j] = i*10+j

层级式的数据布局

这主要使用在层级定义的方法,仍然可以用一维的方式去访问,但存储反而像是以二维的方式存储

这个数据结构在插值等这种需要访问自己邻居的算法

soa存贮方式和aos存贮方式

更改数据结构过后,后面的代码都不需要改

例如之间的数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/593712
推荐阅读
相关标签
  

闽ICP备14008679号