提高Dask阵列计算模板的性能

2024-04-16 11:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

thisthis的问题来看,似乎用dask.array.map_blocksdask.array.ghostdask.array.map_overlap来编程stecil的最简单的方法。所以我有以下代码:

def local_stencil(block):
    block[1:-1,1:-1,1:-1] = ( block[1:-1,1:-1,1:-1] + block[0:-2,1:-1,1:-1] + block[2:,1:-1,1:-1] + block[1:-1,0:-2,1:-1] + block[1:-1,2:,1:-1] + block[1:-1,1:-1,0:-2] + block[1:-1,1:-1,2:]) / 7.0;
    return block

def stencil(grid, iterations, workers):
    g = da.ghost.ghost(grid, depth={0:1, 1:1, 2:1}, boundary={0:0, 1:1, 2:0})
    chunk_size = int(math.pow( g.shape[0]**3/workers, 1/3))
    for iteration in range(iterations):
        g = da.from_array( g.map_blocks(local_stencil).compute(), chunks=chunk_size)
    return da.ghost.trim_internal(g, {0:1, 1:1, 2:1})

我不知道为什么与相同模具函数的numpy版本(local_stencil)相比,它的性能要差得多: enter image description here

我是否可以对代码进行任何更改以提高性能?你知道吗

this的另一个答案中,我理解了当你有一个大于RAM内存的文件时Dask是如何有用的,但是Dask是否也能在计算绑定操作(如矩阵乘法或卷积操作)中有用呢?你知道吗


Tags: 代码mapreturnlocaldefthisblockarray