精华内容
下载资源
问答
  • gpu加速
    千次阅读
    2022-02-08 16:02:57

    GPU 硬件加速是指应用 GPU 的图形性能对浏览器中的一些图形操作交给 GPU 来完成,因为 GPU专门为处理图形而设计,所以它在速度和能耗上更有效率

    GPU 加速通常包括以下几个部分:Canvas2D布局合成(Layout Compositing), CSS3转换(transitions)CSS3 3D变换(transforms)WebGL视频(video)

    css如何开启硬件加速

    • 动画实现过程中利用transform: translateZ(0),欺骗浏览器开启GPU加速
    • will-change开启gpu加速,就是性能不太好

    GPU实现动画的优缺点
    优点:
    利用了GPU合成图层实现动画,可以做到动画平滑、流畅动画合成工作在GPU线程,不会被CPU的js运行阻塞

    缺点:
    绘图层必须传输到GPU,当图层较多时传输过程可能会导致渲染缓慢 每个复合层都需要消耗额外的内存,过多的内存可能导致浏览器的崩溃 复合层合成需要更多的时间

    更多相关内容
  • 首先确定你的显卡是否支持gpu加速,可在nvidia官网查看是否有你的显卡所对应的算力,如图。 为了不影响其他的工作环境,本教程创建anaconda虚拟python环境,打开Anaconda Prompt,输入指令 conda create -n your_...
  • matlab运算采用GPU加速的资料,通过matlab和cuda的交互,提升matlab运行的计算速度
  • 使用opencv进行GPU加速计算机视觉(源码)
  • 用于减少执行时间和加快FEM方程迭代解决方案的设计,尤其是当行长度不均匀时.MCTO应用的FEM大约比CPU上传统FEM快10倍,并且比其他基于行的主要排序格式快数值结果表明,建议的GPU加速存储格式是一种出色的加速器。
  • PyTorch-GPU加速实例

    2020-09-16 15:08:05
    主要介绍了PyTorch-GPU加速实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 为了进一步提高总计算效率,将GPU加速的多级快速多极算法(MLFMA)应用于迭代解决方案。 计算了多个基准对象的雷达横截面(RCS)以证明该解决方案的数值准确性,并表明该方法不仅没有内部共振破坏,而且比常规的FE-...
  • 该项目的目的是研究GPU加速带来的性能提升。 评估了一些应用程序,即WordCount,KMeans-Clustering和浮点排序。 此外,还为Spark的弹性分布式数据集(RDD)实现了许多GPU兼容功能。 纸 论文提交的详细信息即将发布...
  • 本文提出了一种基于GPU加速的几何纹理合成方法,以解决几何纹理合成过程中的高计算量、高存储占用和高耗时等问题。首先,将样本几何纹理数据进行子块划分,以及根据子块在样本中的位置关系设计可重用样本顶点数据的...
  • Pytorch 实现GPU加速.zip

    2021-01-22 15:39:27
    Pytorch 实现GPU加速
  • 算例验证表明,在保证同等精度的前提下,改进后的算法将单角度斜入射问题的计算效率提高了1倍以上,并在此基础上通过GPU硬件加速成功实现了20倍以上的加速比,这证明了GPU加速的改进谱FDTD法的可行性与高效性.
  • 这是时间序列GPU加速深度学习的简短演示,是“时间序列的未来|高性能预测系统的兴起”演示文稿的一部分。 视频和所有支持内容作为一部分提供。 使用单个GluonTS模型创建了7个预测(多次预测) 这是可实现可伸缩性...
  • [Morgan Kaufmann] MATLAB GPU 加速计算 教程 (英文版) [Morgan Kaufmann] Accelerating MATLAB with GPU Computing A Primer with Examples (E-Book)
  • 动态模拟 GPU加速的云的生成和动态模拟 论文 全,各个章节动态模拟 GPU加速的云的生成和动态模拟 论文 全,各个章节动态模拟 GPU加速的云的生成和动态模拟 论文 全,各个章节
  • 线性RankSVM的GPU加速并行算法
  • GPU加速与L-ORB特征提取的全景视频实时拼接,。。。。。。
  • 双目标条纹搜索及GPU加速技术研究.pdf
  • 为了解决实时系统中粒子滤波的计算复杂性问题,提出了一种零bank冲突并行规约的差分...实验表明,随着粒子数增加,计算量以指数增加,采用GPU加速的跟踪算法的执行时间明显减少,有效提高了跟踪精度,降低了计算时间。
  • GAPI:GPU加速的移动对象并行索引方法.pdf
  • 基于LoRa技术和GPU加速的台区拓扑辨识方法.pdf
  • GPU加速数据挖掘算法的研究.pdf
  • 提出了一种基于GPU加速的细粒度并行粒子群算法,将并行PSO求解过程转化为GPU纹理渲染过程,使PSO算法在GPU中加速执行,在取得了较好的优化效果的同时,增大了细粒度并行的粒子规模,提高了算法的运算速度,并为普通...
  • 针对全同态加密应用需求,提出了一种基于Schnhage-Strassen算法的大数乘法GPU加速方法。通过比较相同实验平台下仅用CPU和GPU CPU异构方法实现的大数乘法运算,验证了设计方法的正确性和有效性。实验结果表明,采用...
  • cuda-gpu加速计算

    2018-11-15 15:40:40
    介绍Windows,vs2005环境下,gpu加速计算文件,用于研究图像,科学计算等方面。
  • 基于GPU加速的纳米润滑薄膜分子动力学模拟,胡海豹,刘人玺,对比研究了微流动分子动力学模拟的GPU加速方法,并基于GPU加速技术模拟了纳米润滑薄膜的流动特性。数值模拟中,壁面使用分层壁面,
  • 通过GPU加速数据挖掘的研究进展和实践,GPU在数据挖掘有极大意义
  • 基于GPU加速和非负矩阵分解的并行协同过滤推荐算法.pdf
  • 应用GPU通用高性能编程技术实现一种加速地震叠前时间偏移的新方法。该技术是地震勘探处理的常规流程,其核心算法具有计算密集、数据独立性强、并行性高等特点。通过性能剖析获得其计算热点,通过CUDA技术对其进行...
  • 技术背景 之前写过一篇讲述如何使用pycuda来在Python上写CUDA程序的博客。...还有一种常见的方法是用cupy来替代numpy,相当于一个GPU版本的numpy。那么本文要讲述的是用numba自带的装饰器,来写一个非常Pythonic的CU...

    技术背景

    之前写过一篇讲述如何使用pycuda来在Python上写CUDA程序的博客。这个方案的特点在于完全遵循了CUDA程序的写法,只是支持了一些常用函数的接口,如果你需要自己写CUDA算子,那么就只能使用非常不Pythonic的写法。还有一种常见的方法是用cupy来替代numpy,相当于一个GPU版本的numpy。那么本文要讲述的是用numba自带的装饰器,来写一个非常Pythonic的CUDA程序。

    CUDA的线程与块

    GPU从计算逻辑来讲,可以认为是一个高并行度的计算阵列,我们可以想象成一个二维的像围棋棋盘一样的网格,每一个格子都可以执行一个单独的任务,并且所有的格子可以同时执行计算任务,这就是GPU加速的来源。那么刚才所提到的棋盘,每一列都认为是一个线程,并有自己的线程编号;每一行都是一个块,有自己的块编号。我们可以通过一些简单的程序来理解这其中的逻辑:

    用GPU打印线程编号

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        print ('threadIdx:', cuda.threadIdx.x)
    
    if __name__ == '__main__':
        gpu[2,4]()
    threadIdx: 0
    threadIdx: 1
    threadIdx: 2
    threadIdx: 3
    threadIdx: 0
    threadIdx: 1
    threadIdx: 2
    threadIdx: 3

    用GPU打印块编号

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        print ('blockIdx:', cuda.blockIdx.x)
    
    if __name__ == '__main__':
        gpu[2,4]()
    blockIdx: 0
    blockIdx: 0
    blockIdx: 0
    blockIdx: 0
    blockIdx: 1
    blockIdx: 1
    blockIdx: 1
    blockIdx: 1

    用GPU打印块的维度

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        print ('blockDim:', cuda.blockDim.x)
    
    if __name__ == '__main__':
        gpu[2,4]()
    blockDim: 4
    blockDim: 4
    blockDim: 4
    blockDim: 4
    blockDim: 4
    blockDim: 4
    blockDim: 4
    blockDim: 4

    用GPU打印线程的维度

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        print ('gridDim:', cuda.gridDim.x)
    
    if __name__ == '__main__':
        gpu[2,4]()
    gridDim: 2
    gridDim: 2
    gridDim: 2
    gridDim: 2
    gridDim: 2
    gridDim: 2
    gridDim: 2
    gridDim: 2

    总结

    我们可以用如下的一张图来总结刚才提到的GPU网格的概念,在上面的测试案例中,我们在GPU上划分一块2*4大小的阵列用于我们自己的计算,每一行都是一个块,每一列都是一个线程,所有的网格是同时执行计算的内容的(如果没有逻辑上的依赖的话)。

    GPU所支持的最大并行度

    我们可以用几个简单的程序来测试一下GPU的并行度,因为每一个GPU上的网格都可以独立的执行一个任务,因此我们认为可以分配多少个网格,就有多大的并行度。本机的最大并行应该是在\(2^40\),因此假设我们给GPU分配\(2^50\)大小的网格,程序就会报错:

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        pass
    
    if __name__ == '__main__':
        gpu[2**50,1]()
        print ('Running Success!')

    运行结果如下:

    Traceback (most recent call last):
      File "numba_cuda_test.py", line 10, in <module>
        gpu[2**50,1]()
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py", line 822, in __call__
        self.stream, self.sharedmem)
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py", line 966, in call
        kernel.launch(args, griddim, blockdim, stream, sharedmem)
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/compiler.py", line 699, in launch
        cooperative=self.cooperative)
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 2100, in launch_kernel
        None)
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 300, in safe_cuda_api_call
        self._check_error(fname, retcode)
      File "/home/dechin/.local/lib/python3.7/site-packages/numba/cuda/cudadrv/driver.py", line 335, in _check_error
        raise CudaAPIError(retcode, msg)
    numba.cuda.cudadrv.driver.CudaAPIError: [1] Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE

    而如果我们分配一个额定大小之内的网格,程序就可以正常的运行:

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        pass
    
    if __name__ == '__main__':
        gpu[2**30,1]()
        print ('Running Success!')

    这里加了一个打印输出:

    Running Success!

    需要注意的是,两个维度上的可分配大小是不一致的,比如本机的上限是分配230*210大小的空间用于计算:

    # numba_cuda_test.py
    
    from numba import cuda
    
    @cuda.jit
    def gpu():
        pass
    
    if __name__ == '__main__':
        gpu[2**30,2**10]()
        print ('Running Success!')

    同样的,只要在允许的范围内都是可以执行成功的:

    Running Success!

    如果在本机上有多块GPU的话,还可以通过select_device的指令来选择执行指令的GPU编号:

    # numba_cuda_test.py
    
    from numba import cuda
    cuda.select_device(1)
    import time
    
    @cuda.jit
    def gpu():
        pass
    
    if __name__ == '__main__':
        gpu[2**30,2**10]()
        print ('Running Success!')

    如果两块GPU的可分配空间一致的话,就可以运行成功:

    Running Success!

    GPU的加速效果

    前面我们经常提到一个词叫GPU加速,GPU之所以能够实现加速的效果,正源自于GPU本身的高度并行性。这里我们直接用一个数组求和的案例来说明GPU的加速效果,这个案例需要得到的结果是\(b_j=a_j+b_j\),将求和后的值赋值在其中的一个输入数组之上,以节省一些内存空间。当然,如果这个数组还有其他的用途的话,是不能这样操作的。具体代码如下:

    # gpu_add.py
    
    from numba import cuda
    cuda.select_device(1)
    import numpy as np
    import time
    
    @cuda.jit
    def gpu(a,b,DATA_LENGHTH):
        idx = cuda.threadIdx.x + cuda.blockIdx.x * cuda.blockDim.x
        if idx < DATA_LENGHTH:
            b[idx] += a[idx]
    
    if __name__ == '__main__':
        np.random.seed(1)
        DATA_EXP_LENGTH = 20
        DATA_DIMENSION = 2**DATA_EXP_LENGTH
        np_time = 0.0
        nb_time = 0.0
        for i in range(100):
            a = np.random.randn(DATA_DIMENSION).astype(np.float32)
            b = np.random.randn(DATA_DIMENSION).astype(np.float32)
            a_cuda = cuda.to_device(a)
            b_cuda = cuda.to_device(b)
            time0 = time.time()
            gpu[DATA_DIMENSION,4](a_cuda,b_cuda,DATA_DIMENSION)
            time1 = time.time()
            c = b_cuda.copy_to_host()
            time2 = time.time()
            d = np.add(a,b)
            time3 = time.time()
            if i == 0:
                print ('The error between numba and numpy is: ', sum(c-d))
                continue
            np_time += time3 - time2
            nb_time += time1 - time0
        print ('The time cost of numba is: {}s'.format(nb_time))
        print ('The time cost of numpy is: {}s'.format(np_time))

    需要注意的是,基于Numba实现的Python的GPU加速程序,采用的jit即时编译的模式,也就是说,在运行调用到相关函数时,才会对其进行编译优化。换句话说,第一次执行这一条指令的时候,事实上达不到加速的效果,因为这个运行的时间包含了较长的一段编译时间。但是从第二次运行调用开始,就不需要重新编译,这时候GPU加速的效果就体现出来了,运行结果如下:

    $ python3 gpu_add.py The error between numba and numpy is:  0.0
    The time cost of numba is: 0.018711328506469727s
    The time cost of numpy is: 0.09502553939819336s

    可以看到,即使是相比于Python中优化程度十分强大的的Numpy实现,我们自己写的GPU加速的程序也能够达到5倍的加速效果(在前面一篇博客中,针对于特殊计算场景,加速效果可达1000倍以上),而且可定制化程度非常之高。

    总结概要

    本文针对于Python中使用Numba的GPU加速程序的一些基本概念和实现的方法,比如GPU中的线程和模块的概念,以及给出了一个矢量加法的代码案例,进一步说明了GPU加速的效果。需要注意的是,由于Python中的Numba实现是一种即时编译的技术,因此第一次运算时的时间会明显较长,所以我们一般说GPU加速是指从第二步开始的运行时间。对于一些工业和学界常见的场景,比如分子动力学模拟中的系统演化,或者是深度学习与量子计算中的参数优化,都是相同维度参数多步运算的一个过程,非常适合使用即时编译的技术,配合以GPU高度并行化的加速效果,能够在实际工业和学术界的各种场景下发挥巨大的作用。

    版权声明

    本文首发链接为:https://www.cnblogs.com/dechinphy/p/nbc.html

    作者ID:DechinPhy

    更多原著文章请参考:https://www.cnblogs.com/dechinphy/

    打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

    腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

    展开全文
  • Linux下JavaCv使用GPU加速(Nvidia显卡)

    千次阅读 2022-03-31 16:07:04
    //上图安装的解码器,GPU加速的关键 grabber.setPixelFormat(avutil.AV_PIX_FMT_NV12);//像素格式 grabber.setImageMode(FrameGrabber.ImageMode.COLOR); String byte2Base64= RSAUtil.getMsgByRsa("****"); grabber...

    1.环境配置,安装显卡驱动,cuda,cudnn

    ​​​​​​linux上安装NVIDIA显卡驱动以及深度学习需要的cudn、cudnn、pytorch_宜城有少年的博客-CSDN博客_linux安装nvidia显卡驱动

    2.安装FFmpeg视频转码所需要的包

    (1)安装依赖

    yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel

    (2)安装包

    wget http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.bz2
    tar xjvf nasm-2.13.02.tar.bz2
    cd nasm-2.13.02
    ./autogen.sh
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
    make
    make install
    wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
    tar xzvf yasm-1.3.0.tar.gz
    cd yasm-1.3.0
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
    make
    make install
    git clone git clone https://code.videolan.org/videolan/x264.git
    cd x264
    PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static
    make
    make install
    
    git clone https://bitbucket.org/multicoreware/x265_git.git
    cd x265/build/linux
    cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED:bool=off ../../source
    make
    make install
    git clone --depth 1 --branch v0.1.6 https://github.com/mstorsjo/fdk-aac.git
    cd fdk-aac
    autoreconf -fiv
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    wget http://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz
    tar xzvf lame-3.100.tar.gz
    cd lame-3.100
    ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --disable-shared --enable-nasm
    make
    make install
    wget https://archive.mozilla.org/pub/opus/opus-1.2.1.tar.gz
    tar xzvf opus-1.2.1.tar.gz
    cd opus-1.2.1
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    wget http://downloads.xiph.org/releases/ogg/libogg-1.3.3.tar.gz
    tar xzvf libogg-1.3.3.tar.gz
    cd libogg-1.3.3
    ./configure --prefix="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    wget http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.5.tar.gz
    tar xzvf libvorbis-1.3.5.tar.gz
    cd libvorbis-1.3.5
    ./configure --prefix="$HOME/ffmpeg_build" --with-ogg="$HOME/ffmpeg_build" --disable-shared
    make
    make install
    git clone --depth 1 https://github.com/webmproject/libvpx.git
    cd libvpx
    ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm
    make
    make install
    git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git
    cd nv-codec-headers
    make PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin"
    make install PREFIX="$HOME/ffmpeg_build" BINDDIR="$HOME/bin" 

    安装ffmpeg

    wget http://ffmpeg.org/releases/ffmpeg-4.4.tar.bz2
    tar xjvf ffmpeg-4.4.tar.bz2
    cd ffmpeg-4.4
    PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure \
      --prefix="$HOME/ffmpeg_build" \
      --pkg-config-flags="--static" \
      --extra-cflags="-I$HOME/ffmpeg_build/include -I/usr/local/cuda/include" \
      --extra-ldflags="-L$HOME/ffmpeg_build/lib -L/usr/local/cuda/lib64" \
      --extra-libs=-lpthread \
      --extra-libs=-lm \
      --bindir="$HOME/bin" \
      --enable-gpl \
      --enable-libfdk_aac \
      --enable-libmp3lame \
      --enable-libopus \
      --enable-libvorbis \
      --enable-libvpx \
      --enable-libx264 \
      --enable-libx265 \
      --enable-nonfree \
      --enable-cuda \
      --enable-cuvid \
      --enable-nvenc \
      --enable-libnpp
    make
    make install
    hash -r

    查看版本ffmpeg -h

    查看编码器 ffmpeg -hwaccels

    查看编码视频是否成功

    ffmpeg -hwaccel cuvid -c:v h264_cuvid -i /home/rtsp/test.mp4 -c:v h264_nvenc -b:v 2048k -vf scale_npp=1280:-1 -y /home/2.mp4
    

    3.使用GPU加速JavaCV

        //解析视频时
        public FFmpegFrameGrabber getGrabberByUrl(String url) throws  Exception{
            FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(url);
            grabber.setFormat("rtsp");
            grabber.setVideoCodecName("hevc_nvenc");//上图安装的解码器,GPU加速的关键
            grabber.setPixelFormat(avutil.AV_PIX_FMT_NV12);//像素格式
            grabber.setImageMode(FrameGrabber.ImageMode.COLOR);
            String byte2Base64= RSAUtil.getMsgByRsa("****");
            grabber.setOption("rtsp_transport", "tcp");//tcp传输协议
            grabber.setOption("appkey", "****");//海康视频 appkey
            grabber.setOption("secret", byte2Base64);//海康视频 secret
            grabber.setOption("playMode", "0");//初始播放模式:0-预览,1-回放
            grabber.setOption("port", "446");//综合安防管理平台端口,若启用HTTPS协议,默认443
            grabber.setOption("enableHTTPS", "1"); //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
            grabber.setOption("rtsp_flags", "prefer_tcp");
            // 设置缓存大小,提高画质、减少卡顿花屏
            grabber.setOption("buffer_size", "1024000");
            grabber.setOption("stimeout", "3000000");
            grabber.start();
            return grabber;
        }
    //推流时
    FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(url,grabber.getImageWidth(),grabber.getImageHeight(),1);
                    recorder.setVideoCodecName("h264_nvenc");//编码器,GPU加速关键
                    recorder.setPixelFormat(avutil.AV_PIX_FMT_NV12);//像素格式
                    recorder.setFrameRate(grabber.getFrameRate());
                   recorder.setInterleaved(true);
                    // 降低编码延时
                 /*   recorder.setVideoOption("tune", "zerolatency");
                    // 提升编码速度
                    recorder.setVideoOption("preset", "ultrafast");*/
                    // 视频质量参数(详见 https://trac.ffmpeg.org/wiki/Encode/H.264)
                    recorder.setVideoOption("crf", "28");
                    // 分辨率
                    recorder.setVideoBitrate(2000000);
                    // 视频编码格式
                    recorder.setVideoCodec(grabber.getVideoCodec());
                    // 视频格式
                    recorder.setFormat("flv");
                    // 视频帧率
                    recorder.setFrameRate(grabber.getFrameRate());
                    recorder.setGopSize(60);
                    //recorder.setAudioOption("crf", "0");
                    recorder.setAudioQuality(0);
                    recorder.setAudioBitrate(192000);
                    recorder.setSampleRate(44100);
                    // 建议从grabber获取AudioChannels
                   // recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
                    recorder.start();
    
       for(;(frame=grabber.grabImage())!=null;) {
            recorder.record(frame);
        }

    使用nvidia-smi查看GPU使用情况

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,955
精华内容 33,982
关键字:

gpu加速

友情链接: AStar规划.zip