<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>NPU on zzudongxiang</title><link>https://www.zzudongxiang.com/tags/npu/</link><description>Recent content in NPU on zzudongxiang</description><generator>Hugo</generator><language>zh-cn</language><copyright>2026 zzudongxiang.com · 豫ICP备2022012018号-1 · 豫公网安备41160202000614号</copyright><lastBuildDate>Thu, 18 Apr 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://www.zzudongxiang.com/tags/npu/index.xml" rel="self" type="application/rss+xml"/><item><title>HCCL集合通信测试环境设置</title><link>https://www.zzudongxiang.com/posts/hccl-test-environment/</link><pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.zzudongxiang.com/posts/hccl-test-environment/</guid><description>&lt;div&gt;
&lt;h2 id="1-快速使用"&gt;&lt;span fontsize="" color=""&gt;1. 快速使用&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;HCCL（Huawei Collective Communication Library）是基于昇腾AI处理器的高性能集合通信库，其主要功能与作用与Nvidia的NCCL库相似，主要用于集合通信，CANN库种自带一套测试工具用以分析集合通信性能。&lt;/span&gt;&lt;/p&gt;
&lt;h3 id="11-编译环境配置"&gt;&lt;span fontsize="" color=""&gt;1.1 编译环境配置&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;前置环境配置阶段请参考&lt;/span&gt;&lt;a href="https://git.zzudongxiang.com/pcl.cloudbrain.project/mindspore.llama2/src/branch/main/README.md"&gt;&lt;span fontsize="" color=""&gt;Llama2部署记录&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;，后续的所有流程均需要在具备HCCL硬件的平台上实现，需要注意的是，建议使用的Ubuntu版本大于等于20.04LTS，否则可能会遇到VSCode不支持的情况。&lt;/span&gt;&lt;/p&gt;
&lt;h4 id="a-cann"&gt;&lt;span fontsize="" color=""&gt;A. CANN&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;CANN的配置过程参考&lt;/span&gt;&lt;a href="https://git.zzudongxiang.com/pcl.cloudbrain.project/mindspore.llama2/src/branch/main/README.md"&gt;&lt;span fontsize="" color=""&gt;Llama2部署记录&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;文档的&lt;/span&gt;&lt;strong&gt;&lt;span fontsize="" color=""&gt;4. 安装CANN&lt;/span&gt;&lt;/strong&gt;&lt;span fontsize="" color=""&gt;章节，并记录安装位置，以备后续使用&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;完成CANN后，建议在&lt;/span&gt;&lt;code&gt;~/.bashrc&lt;/code&gt;&lt;span fontsize="" color=""&gt;文件中添加对应的环境变量，例如：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 使用nano打开~/.bashrc文件
 nano ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在文件的最后添加&lt;/span&gt;&lt;code&gt;export ASCEND_HOME=/usr/local/Ascend/ascend-toolkit/latest&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="b-openmpi"&gt;&lt;span fontsize="" color=""&gt;B. OpenMPI&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在&lt;/span&gt;&lt;a href="https://www.mpich.org/"&gt;&lt;span fontsize="" color=""&gt;OpenMPI官网&lt;/span&gt;&lt;/a&gt;&lt;span fontsize="" color=""&gt;找到对应版本的安装包下载，然后解压缩安装包，以&lt;/span&gt;&lt;code&gt;mpich-4.2.0&lt;/code&gt;&lt;span fontsize="" color=""&gt;版本为例：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # mpich下载链接参考：https://www.mpich.org/static/downloads
 wget https://www.mpich.org/static/downloads/4.2.0/mpich-4.2.0.tar.gz
 # 解压缩mpich压缩包
 tar -zxvf mpich-4.2.0.tar.gz
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;配置mpi的安装路径，以&lt;/span&gt;&lt;code&gt;/root/mpich&lt;/code&gt;&lt;span fontsize="" color=""&gt;路径为例：&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 新建文件夹
 mkdir ~/mpich
 # 进入解压缩后的mpich文件夹
 cd mpich-4.2.0
 # 配置安装路径
 ./configure -prefix=/root/mpich --disable-fortran
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;使用&lt;/span&gt;&lt;code&gt;make&lt;/code&gt;&lt;span fontsize="" color=""&gt;命令构建mpich的可执行文件，该过程可能耗时比较长&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; make
 make install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;完后后将mpich添加到环境变量种，并添加对应的链接库和帮助文件&lt;/span&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # 修改~/.bashrc文件
 nano ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span fontsize="" color=""&gt;在最后一行添加以下内容：&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;export MPI_HOME=/root/mpich&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;export PATH=&lt;/code&gt;$MPI_HOME/bin:$&lt;code&gt;PATH&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Llama2部署记录</title><link>https://www.zzudongxiang.com/posts/llama2-deployment/</link><pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.zzudongxiang.com/posts/llama2-deployment/</guid><description>&lt;div&gt;
&lt;h2 id="1-创建docker"&gt;1. 创建docker&lt;/h2&gt;
&lt;h3 id="11-docker命令"&gt;1.1 docker命令&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;显示全部的镜像：&lt;code&gt;docker images&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建一个容器：&lt;code&gt;docker run ...&lt;/code&gt;&amp;lt;查看1.2节内容&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显示全部的容器：&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动一个容器：&lt;code&gt;docker start &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;停止一个容器：&lt;code&gt;docker stop &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入一个正在运行的程序：&lt;code&gt;docker exec -it &amp;lt;id&amp;gt; /bin/bash&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除一个容器：&lt;code&gt;docker rm &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="12-创建容器"&gt;1.2 创建容器&lt;/h3&gt;
&lt;p&gt;创建一个docker容器的时候需要同时挂载本地工作目录和相关的程序驱动，因此创建docker容器的命令参数较多，以下为一个创建docker容器命令的基本格式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; docker run -it --ipc=host --name &amp;lt;name&amp;gt; -v &amp;lt;local_path&amp;gt;:&amp;lt;docker_path&amp;gt; \
     --workdir=&amp;lt;docker_path&amp;gt; \
     --pids-limit 409600 \
     --privileged --network=host \
     --shm-size=128G \
     --device=/dev/davinci0 \
     --device=/dev/davinci1 \
     --device=/dev/davinci2 \
     --device=/dev/davinci3 \
     --device=/dev/davinci4 \
     --device=/dev/davinci5 \
     --device=/dev/davinci6 \
     --device=/dev/davinci7 \
     --device=/dev/davinci_manager \
     --device=/dev/devmm_svm \
     --device=/dev/hisi_hdc \
     -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
     -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
     -v /usr/local/Ascend/add-ons/:/usr/local/Ascend/add-ons/ \
     -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
     -v /usr/local/dcmi:/usr/local/dcmi \
     -v /etc/ascend_install.info:/etc/ascend_install.info \
     -v /etc/bashrc:/etc/bashrc \
     -p 223:223 \
     -p 224:6006 \
     -p 225:8080 \
     -p 226:8888 \    
     -u root \
    &amp;lt;image_id&amp;gt; /bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-it&lt;/code&gt;：已交互方式运行容器，并分配一个终端&lt;/p&gt;</description></item><item><title>Nvidia GPU与Huawei NPU</title><link>https://www.zzudongxiang.com/posts/nvidia-gpu-huawei-npu/</link><pubDate>Mon, 01 Apr 2024 00:00:00 +0000</pubDate><guid>https://www.zzudongxiang.com/posts/nvidia-gpu-huawei-npu/</guid><description>&lt;div&gt;
&lt;h1 id="1-nvidia-gpu"&gt;1. Nvidia GPU&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考文献：&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: 14.4px"&gt;HeKun-NVIDIA. CUDA-Programming-Guide-in-Chinese&lt;/p&gt;
\[EB/OL\]&lt;p&gt;. &lt;/span&gt;&lt;a href="https://github.com/HeKun-NVIDIA/CUDA-Programming-Guide-in-Chinese" rel="noopener noreferrer nofollow" target="_blank"&gt;&lt;span style="font-size: 14.4px"&gt;&lt;a href="https://github.com/HeKun-NVIDIA/CUDA-Programming-Guide-in-Chinese"&gt;https://github.com/HeKun-NVIDIA/CUDA-Programming-Guide-in-Chinese&lt;/a&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 14.4px"&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nvidia. Nvidia CUDA编程指南&lt;/p&gt;
\[M\]&lt;p&gt;. 1.1. Nvidia, 2008.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="11-gpu架构"&gt;1.1 GPU架构&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;软件层面架构&lt;/strong&gt;：Nvidia GPU的架构在进行CUDA软件操作时可以抽象为：&lt;code&gt;Thread-&amp;gt;Block-&amp;gt;Grid&lt;/code&gt;三层，通过指定这三个参数可以精确的控制目标运算放在目标的&lt;code&gt;Thread&lt;/code&gt;上进行计算。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬件层面架构&lt;/strong&gt;：在硬件层可以讲GPU抽象为：&lt;code&gt;SP(Streaming Processor)-&amp;gt;SM(Streaming Multiprocessor)-&amp;gt;Device&lt;/code&gt;三层，基本对应CUDA软件编程层面的&lt;code&gt;Thread-&amp;gt;Block-&amp;gt;Grid&lt;/code&gt;，Nvidia的GPU在指令集上属于是SIMD（Single Instruction Multiple Data）架构，可以实现单条指令在多个数据的并行处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;集群层面架构&lt;/strong&gt;：在集群层面，一般按照&lt;code&gt;Host-Device&lt;/code&gt;结构划分，其中一个&lt;code&gt;Host&lt;/code&gt;可以视作一个由CPU、GPU、内存、硬盘等组成的主机，&lt;code&gt;Device&lt;/code&gt;一般特指某一个指定的GPU设备，也就是软件层面的&lt;code&gt;Grid&lt;/code&gt;。&lt;/p&gt;
&lt;img src="images/image-exzl.png" style="display: inline-block;width:65.0%" /&gt;
&lt;p&gt;图. Nvidia的GPU架构&lt;/p&gt;
&lt;h3 id="a-sp--thread"&gt;A. SP / Thread&lt;/h3&gt;
&lt;p&gt;GPU上每个&lt;code&gt;SP&lt;/code&gt;主要由ALU（逻辑控制单元）与FPU（浮点运算单元）组成，可以进行简单的逻辑运算与浮点运算，每个&lt;code&gt;SP&lt;/code&gt;在对应软件层面可以操作的一个&lt;code&gt;Thread&lt;/code&gt;，也是开发者可以操作的最小单元，用户可以借助CUDA在&lt;code&gt;Thread&lt;/code&gt;上实现SPMD（Single Program Multiple Data）操作。&lt;/p&gt;
&lt;h3 id="b-mp--block"&gt;B. MP / Block&lt;/h3&gt;
&lt;p&gt;多个&lt;code&gt;Thread&lt;/code&gt;组成一个&lt;code&gt;Block&lt;/code&gt;，同一个&lt;code&gt;Block&lt;/code&gt;上的&lt;code&gt;Thread&lt;/code&gt;共享同一块内存（Shared Memory），这种方法可以实现同一个&lt;code&gt;Block&lt;/code&gt;上并行的&lt;code&gt;Thread&lt;/code&gt;可以并行的对同一块内存中的数据进行操作。&lt;/p&gt;
&lt;p&gt;在进行CUDA编程时，开发者可以借助一个&lt;code&gt;SM&lt;/code&gt;控制多个&lt;code&gt;Block&lt;/code&gt;中的&lt;code&gt;Thread&lt;/code&gt;进行运算，&lt;code&gt;SM&lt;/code&gt;中还包含一些必要的寄存器、共享内存、L1Cache、Scheduler、SPU、LD/ST单元等。&lt;/p&gt;
&lt;h3 id="c-device--grid"&gt;C. Device / Grid&lt;/h3&gt;
&lt;p&gt;多个&lt;code&gt;Block&lt;/code&gt;一起共同组成一个&lt;code&gt;Grid&lt;/code&gt;，也就是硬件层面与集群层面的&lt;code&gt;Device&lt;/code&gt;，借助该概念可以实现集群中多个GPU之间的数据传输和并行计算。&lt;/p&gt;
&lt;h2 id="12-gpu编程"&gt;1.2 GPU编程&lt;/h2&gt;
&lt;p&gt;Nvidia的GPU上有多个&lt;code&gt;Thread&lt;/code&gt;可以并行的完成矩阵运算，例如在进行通用矩阵乘（GEMM，General matrix multiply）时，不同&lt;code&gt;Thread&lt;/code&gt;在共享内存中取出对应位置的数据进行计算，并讲结果重新放置在共享内存中以实现GEMM的并行计算。&lt;/p&gt;
&lt;img src="images/image-putm.png" style="display: inline-block;width:50.0%" /&gt;
&lt;p&gt;图. 使用共享内存并行计算矩阵乘&lt;/p&gt;
&lt;p&gt;在代码层面的实现过程大致如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Host层面的矩阵乘，假定矩阵的维度是BLOCK_SIZE的整数倍
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MatMul&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Matrix A, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Matrix B, Matrix C) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 从显存中加载A和B两个矩阵的数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#a6e22e"&gt;cudaMalloc&lt;/span&gt;(..., size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#a6e22e"&gt;cudaMemcpy&lt;/span&gt;(..., ..., size, cudaMemcpyHostToDevice);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 从设备显存中申请储存乘法运算结果的矩阵C
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#a6e22e"&gt;cudaMalloc&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;d_C.elements, size);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 调用内核
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     MatMulKernel&lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;dimGrid, dimBlock&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;(d_A, d_B, d_C); &lt;span style="color:#75715e"&gt;// &amp;lt;&amp;lt;&amp;lt;dimGrid, dimBlock&amp;gt;&amp;gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 从显存中获取计算结果C
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#a6e22e"&gt;cudaMemcpy&lt;/span&gt;(..., ..., size, cudaMemcpyDeviceToHost);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 释放显存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#a6e22e"&gt;cudaFree&lt;/span&gt;(...);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 调用MatMul()以实现Kernel层的矩阵乘
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; __global__ &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MatMulKernel&lt;/span&gt;(Matrix A, Matrix B, Matrix C) { &lt;span style="color:#75715e"&gt;// __global__
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#75715e"&gt;// 每个Thread计算矩阵C中的一个元素，并将结果累加到CValue中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; Cvalue &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; row &lt;span style="color:#f92672"&gt;=&lt;/span&gt; blockIdx.y &lt;span style="color:#f92672"&gt;*&lt;/span&gt; blockDim.y &lt;span style="color:#f92672"&gt;+&lt;/span&gt; threadIdx.y;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; col &lt;span style="color:#f92672"&gt;=&lt;/span&gt; blockIdx.x &lt;span style="color:#f92672"&gt;*&lt;/span&gt; blockDim.x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; threadIdx.x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; e &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; e &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; A.width; &lt;span style="color:#f92672"&gt;++&lt;/span&gt;e)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;         Cvalue &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; A.elements[row &lt;span style="color:#f92672"&gt;*&lt;/span&gt; A.width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; e] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; B.elements[e &lt;span style="color:#f92672"&gt;*&lt;/span&gt; B.width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; col];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;     C.elements[row &lt;span style="color:#f92672"&gt;*&lt;/span&gt; C.width &lt;span style="color:#f92672"&gt;+&lt;/span&gt; col] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Cvalue;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="2-huawei-npu"&gt;2. Huawei NPU&lt;/h1&gt;
&lt;p&gt;Huawei的NPU设备Ascend 910B相较于Nvidia的GPU做了一些有针对性的优化，同时由于NPU主要针对神经网络训练与推理，因此其在芯片设计架构上与Nvidia的GPU拥有完全不同的设计思路。&lt;/p&gt;</description></item></channel></rss>