MJ
intro
两个phase,
- 扫描(x,y)所在的列,也就是x固定。计算列上每一个点到(x,y)的直线距离。
- 扫描行,计算距离。
phase 1
就是双向扫描,
phase 2
scan 3:
先解释一下抛物线。固定y=y0,给定obs坐标(i,j),那么y0这条线上的点到obs就是抛物线。
u在x轴递增(0–>m-1),先不考虑i>u处的obstacle。
case b:
如果u处的obs和y0上所有点的距离(用t[q]来代表),比所有点与其之前计算过的最近obs距离都要小,那么u将之前的obs都dominant了,现在只有一个seg,那就是u对y0的距离抛物线。
如果不是case b,那么计算x轴上转折点,也就是u可以dominant多少。算出的转折点是w,如果w>m,那么就是case a,不符合。
case c: 在x>w的时候,u dominant其他obs,此时进行更新。
增加一段seg;
增加的seg最近的obs为u;
增加一个转折点。
scan 4:
从后向前计算dt.遇上一个分界点,将obs切换到左边一个。
实现细节
github cutt
CUTT: A HIGH-PERFORMANCE TENSOR TRANSPOSE LIBRARY FOR GPUS
cutt将_g拷贝到_h并进行旋转
代码中使用了4个phase。每个phase之间有tensor transpose,进行坐标变换。顺便sync threads,为下一个Phase做准备。
cutt_plan我是真不知道,所以坐标变换顺序是瞎说的,还要问问shupeng才能搞清楚。
可以参考swap axis–permutation
phase1:双向扫描。 坐标:xyz(mnp)
phase2: scan3 和scan4,生成二维EDT。 坐标:y’x’z’(nmp)。
这里的x其实是变换后的y。在这个thread上,变换后的y被看作常量,是Phase1计算好的g(现在叫h)。在x上iter
phase 3: 在z轴上进行scan3 和scan 4,生成三维EDT。按照初始状况来看,坐标:z’‘x’‘y’’(npm)。此时变换后的z被看作常量。在y’'上iter
phase 4: 更新seen map。局部地图加上偏置,就可以更新全局地图。
此时坐标转回xyz。
- 如果要用dynamic parallism需要额外链接步骤
maurer
利用3 remarks:
remark 1
vironoi sites in this dimension can be compisited by vironoi sites in lower dimension .
–> dim reduction
remark 2
单调性,有了一系列VCd的集合,可以根据他们在d维度上的坐标值,用一遍扫描来决定Rd上点对应的VC。
remark 3
有u,v,w三个VC,根据他们之间垂直平分线在Rd上的交点坐标顺序,可以判断中间点v是否intersect Rd.