我有一个包含稀疏几何体非立方边界框的三维数组。
如果(x,y,z)是计算域的一部分,则数组geometry[x][y][z]包含值0,否则为1。
为了重新排序计算,我想使用希尔伯特曲线遍历这个空间。
上下文是优化内存受限GPU程序中的全局内存访问。
我该如何实现?
更新: 我只想遍历非空单元格,因为我将仅与邻接列表(其中记录元素的19个相邻节点)一起将其存储在数组中。
计算只是在两个数组之间进行复制:
如果(x,y,z)是计算域的一部分,则数组geometry[x][y][z]包含值0,否则为1。
为了重新排序计算,我想使用希尔伯特曲线遍历这个空间。
上下文是优化内存受限GPU程序中的全局内存访问。
我该如何实现?
更新: 我只想遍历非空单元格,因为我将仅与邻接列表(其中记录元素的19个相邻节点)一起将其存储在数组中。
计算只是在两个数组之间进行复制:
dst[i] = src[adjacency_map[i]]
这是一种稀疏Lattice Boltzmann方法的传播阶段,物理上解释为从相邻位置流动“流体粒子”。
邻接映射中数值越连续,我们就能获得更多合并内存访问的希望。
OpenCL内核:
__kernel void propagation(__global double *dst, __global double *source,
__global const int *adjacency_map, const uint max_size)
{
size_t l = get_global_id(0);
if( l > max_size )
return;
dst[l] = src[adjacency_map[l]];
}