关于第三讲中taichi_sparse里面下标计算的问题

运行环境

[Taichi] version 0.7.32, llvm 10.0.0, commit 6652f94f, win, python 3.9.7
[Taichi] Starting on arch=cuda

问题描述

taichi_sparse中,每个层级的block的下标计算如下:

t = x[i, j]
block1_index = ti.rescale_index(x, block1, ti.Vector([i, j]))  # ti.Vector([i, j]) // 64
block2_index = ti.rescale_index(x, block2, ti.Vector([i, j]))  # ti.Vector([i, j]) // 16
block3_index = ti.rescale_index(x, block3, ti.Vector([i, j]))  # ti.Vector([i, j]) // 4

但个人感觉正确的下标计算应该是:

t = x[i, j]
block1_index = ti.Vector([i, j]) // 64               # (i, j) 在 block1 (8 * 8) 中的的相对位置
block2_index = (ti.Vector([i, j]) % 64) // 16        # (i % 64, j % 64) 在 block2 (4 * 4) 中的相对位置
block3_index = ((ti.Vector([i, j]) % 64) % 16) // 4  # ((i % 64) % 16, (i % 64) % 16) 在 block3 (4 * 4) 中的相对位置

Hi @gaoxinge,非常欢迎来到太极论坛。

关于rescale_index,你可以参考:here

其实在使用这个函数的时候,比如

block1_index = ti.rescale_index(x, block1, ti.Vector([i, j])) 

得到的是block1这个层次,( 8\times8 )block中哪个block包含 x

之前一直以为block1,block2,block3是这种层级关系,需要取余然后再进行嵌套计算。

虽然block是三层,但每一层的 block 都是相对于 (512 \times 512) 的一种划分:

  • block1 把整个图划分成 (8 \times 8) 个 cell,每个 cell 有 (64 \times 64)
  • block2 把整个图划分成 (32 \times 32) 个 cell,每个 cell 有 (16 \times 16)
  • block3 把整个图划分成 (128 \times 128) 个 cell,每个 cell 有 (4 \times 4)

通过 rescale_index 可以计算出哪个 cell 包含了 x

P.S. 谢谢!文档中的也很清晰!

1 个赞