1. 简介

本文档描述了如何快速开始在曦云® 系列GPU上进行GPU编程,包括编程环境的安装验证、MXMACA® 的编程模型和MXMACA的编程接口等内容介绍。

本文档主要适用于以下人员:

  • 在曦云系列GPU上进行程序开发工作的客户和用户

  • 使用MXMACA进行GPU编程的程序员

2. 编程环境

本节以Ubuntu 18.04系统环境为例进行本地离线安装示范。支持的软硬件平台兼容列表,参见《曦云® 系列通用计算GPU用户指南》中“系统支持范围”章节。

2.1. 安装准备

操作步骤

  1. 执行以下命令,检查是否拥有支持MXMACA的GPU。

    lspci | grep 9999
    
    • 如果机器上有N(N>0)张曦云GPU板卡,回显中含“9999”字段的行数为N时,则表示曦云GPU板卡正常在位。

      例如,若机器上有2张曦云C500且都正常在位,回显信息如下所示。

      01:00.0 Display controller: Device 9999:4001 (rev 01)
      02:00.0 Display controller: Device 9999:4001 (rev 01)
      
    • 如果机器上有曦云系列GPU板卡但无内容显示,执行以下命令,检查是否已成功安装对应的GPU板卡驱动。

      lsmod | grep metax
      

      若无内容显示,则表示未成功安装对应的GPU板卡驱动。驱动安装参见《曦云® 系列通用计算GPU驱动安装指南》中“安装驱动”章节。

      备注

      驱动安装成功后,需要重启系统。

  2. 验证是否拥有支持MXMACA编程环境的Linux发行版。

    执行以下命令,确认正在运行的Linux发行版及其版本号。

    uname -m && cat /etc/*release
    

    MXMACA编程环境仅在某些特定的Linux发行版上受支持。详情参见《曦云® 系列通用计算GPU用户指南》中“系统支持范围”章节。

    例如,机器是64位系统(x86_64),并且安装了Ubuntu 18.04的操作系统,回显信息如图 2.1 所示。

    _images/figure_2_1.png

    图 2.1 编程环境验证回显示例

  3. 验证系统是否已安装正确版本的GCC、g++、libstdc++、CMake和Make。

    以验证系统上安装的GCC版本为例,执行以下命令:

    gcc --version
    

    使用MXMACA工具包进行开发必须安装GCC、g++、libstdc++、CMake和Make。运行MXMACA应用程序不需要。 它们通常是作为Linux安装的一部分进行安装的,在大多数情况下,与受支持的Linux一起安装的GCC、g++、libstdc++、CMake和Make,都会正常工作。

    例如,Ubuntu 18.04操作系统上安装了GCC 7.5.0版本,回显信息如图 2.2 所示。

    _images/figure_2_2.png

    图 2.2 系统验证回显示例

2.2. 安装MXMACA编程环境

MXC500 GPU的MXMACA编程环境从2.31.0开始支持以下两种安装方法:

  • 本地离线安装MXMACA编程环境:支持所有发行版本的MXMACA软件栈。详细步骤参见 2.2.1 本地离线安装MXMACA编程环境

  • 在线安装MXMACA编程环境:支持2.31.0及之后版本的MXMACA软件栈,主要面向特定操作系统选定版本的包管理器安装(Package Manager Installation)。详细步骤参见 2.2.2 在线安装MXMACA编程环境

2.2.1. 本地离线安装MXMACA编程环境

2.2.1.1. 安装MXMACA编程环境

备注

如果已安装了旧版本的MXMACA,请参见 2.2.1.5 卸载MXMACA编程环境的相应方式进行卸载后,再安装新版本的MXMACA。

操作步骤

  1. 安装MXMACA依赖。

    MXMACA的依赖列表,参见表 2.1

    请确认表格中的依赖库是否都已安装;若没有,请自行获取并安装。

    表 2.1 MXMACA依赖列表

    序号

    依赖名称

    依赖安装命令

    1

    libmsgpackc2

    sudo apt install libmsgpackc2

    2

    libelf1

    sudo apt install libelf1

    3

    libnuma1

    sudo apt install libnuma1

    4

    libssl1.1

    sudo apt install libssl1.1

    1. 以libmsgpackc2为例,执行以下命令:

      dpkg -l 'libmsgpackc2'
      
    2. 如果系统返回 dpkg-query: no packages found matching libmsgpackc2,使用 apt 安装 libmsgpackc2

      sudo apt install libmsgpackc2
      
    3. 使用以下命令再次进行查询。结果如图 2.3 所示,表示 libmsgpackc2 安装成功。

      dpkg -l 'libmsgpackc2'
      
      _images/figure_2_3.png

      图 2.3 libmsgpackc2安装成功示例

  2. 解压获取安装包。

    1. 获取MXMACA SDK的tar安装包 maca-sdk-mxc500-x.x.x.x-deb-x86_64.tar.xz,解压后可以看到 mxmaca-sdk-install.shversion_compatible_check.shappimagedeb 等子目录。将安装包放入目标服务器,包内基础文件如下所示。

      ├── appimage
      ├── deb
      ├── mxmaca-sdk-install.sh
      └── version_compatible_check.sh
      
      2 directories, 2 files
      
    2. 获取metax驱动安装包 metax-driver-mxc500-x.x.x.x-deb-x86_64.run。将安装包放入目标服务器。

  3. 执行以下命令,安装MXMACA编程环境。

    cd xxx ##(MXMACA SDK解压目录)
    sudo ./mxmaca-sdk-install.sh -f
    
    cd xxx ##(MXMACA 驱动所在目录)
    sudo chmod +x metax-driver-mxc500-x.x.x.x-deb-x86_64.run
    sudo ./metax-driver-mxc500-x.x.x.x-deb-x86_64.run -- -f
    

    安装成功后的目录如下所示。

    root@device-01:/opt/maca$ tree -L 1
    .
    ├── bin
    ├── etc
    ├── ffmpeg
    ├── include
    ├── lib
    ├── mxgpu_llvm
    ├── ompi
    ├── samples
    ├── share
    ├── tools
    ├── ucx
    ├── Version.txt
    └── wheel
    
    12 directories, 1 file
    

2.2.1.2. 配置MXMACA编程环境

MXMACA目前仅支持在默认路径 /opt/maca 下进行安装。

操作步骤

  1. 将以下MXMACA路径加入 PATH 环境变量中。

    export PATH=$PATH:/opt/maca/mxgpu_llvm/bin:/opt/maca/bin
    
  2. 定义以下MXMACA环境变量。

    export MACA_PATH=/opt/maca
    export LD_LIBRARY_PATH=/opt/maca/lib:/opt/maca/mxgpu_llvm/lib
    

2.2.1.3. 启用MXMACA程序的访问权限

MXMACA程序需要特定文件夹的访问权限,但MXMACA程序进程不会修改文件夹中任何文件内容。

操作步骤

  1. 执行以下命令,启用访问权限。

    sudo usermod –aG video $USER
    

    将用户加入video用户组,为其启用访问权限。

2.2.1.4. 验证MXMACA编程环境的安装

操作步骤

  1. 执行以下命令,检查是否正确安装MXMACA编程环境。

    macainfo
    

    如下所示,如果 macainfo 在有曦云系列GPU运行的系统中正常运行,说明MXMACA编程环境安装成功。

    root@device-01:/opt/maca$ macainfo
    ======================
    MXC System Attributes
    ======================
    Runtime Version: 1.0
    System Timestamp Freq: 1000MHz
    Signal Max Wait Time: 18446744073709551615(0xffffffffffffffff)
    Machine Model: LARGE
    System Endianess: LITTLE
    

2.2.1.5. 卸载MXMACA编程环境

操作步骤

  1. 执行以下命令,卸载MXMACA编程环境。

    sudo /opt/maca/bin/mxmaca-sdk-install.sh -U
    sudo /opt/mxdriver/mxdriver-install.sh -U
    

    备注

    使用MXMACA安装在系统路径下的 mxmaca-sdk-install.shmxdriver-install.sh 脚本进行卸载。

2.2.2. 在线安装MXMACA编程环境

在线安装MXMACA编程环境时,会与系统的包管理系统进行交互。rpm或deb软件包在安装时通过包管理器(如apt、yum或pip)自动下载。 详细步骤参见在线指导:https://developer.metax-tech.com/softnova/index

2.3. 验证MXMACA编程环境

2.3.1. 获取MXMACA源码示例

操作步骤

  1. 参见 2.2 安装MXMACA编程环境,成功安装MXMACA编程环境后,在 samples 目录下获取MXMACA源码示例。

    root@device-01:/opt/maca$ tree -L 1
    .
    ├── bin
    ├── etc
    ├── ffmpeg
    ├── include
    ├── lib
    ├── mxgpu_llvm
    ├── ompi
    ├── samples (*)
    ├── share
    ├── tools
    ├── ucx
    ├── Version.txt
    └── wheel
    
    12 directories, 1 file
    

2.3.2. 验证MXMACA编程环境

通过Makefile构建Linux MXMACA程序。

2.3.2.1. 用参考示例项目的Makefile构建MXMACA程序

示例项目的Makefile会使用一些特定选项,可参见表 2.2

操作步骤

  1. 复制一个示例项目(比如 vectorAdd)到测试路径下,并将当前路径更改为要构建MXMACA程序的示例项目路径。

    mkdir test
    cp /opt/maca/samples/0_Introduction/vectorAdd/ test/ -R
    cd test/vectorAdd/
    
  2. 选择以下任一方法构建MXMACA程序。

    • 仅构建MXMACA程序:

      $ make
      

      MXMACA程序会被构建并生成到示例项目所在路径下,进行运行和启动。

    • 构建并直接启动MXMACA程序:

      $ make run
      [Vector addition of 50000 elements]
      Copy input data from the host memory to the MXMACA device
      MXMACA kernel launch with 196 blocks of 256 threads
      Copy output data from the MACA device to the host memory
      Test PASSED
      MXMACA Sample Done
      
  3. 执行以下命令,清除构建MXMACA程序时生成的项目文件。

    make clean
    

2.3.2.2. 用自己的Makefile构建MXMACA程序

操作步骤

  1. 如需从零开始写一个MXMACA项目Makefile,可参见访问 Makefile官方指导手册

  2. 新建自己的Makefile时,如果需要使用一些特定选项,可参见表 2.2 进行配置。

    表 2.2 列出了mxcc编译和构建MXMACA程序时支持的典型选项。mxcc支持的更多选项,参见《曦云® 系列通用计算GPU mxcc编译器用户指南》。

    表 2.2 编译和构建MXMACA程序时的可用选项

    序号

    选项

    选项备注

    1

    # Location of the MXMACA Toolkit

    MACA_PATH ?= /opt/maca

    2

    # start deprecated interface #

    TARGET_ARCH ?= x86_64

    仅支持x86_64

    3

    #architecture

    HOST_ARCH := $(shell uname -m)

    TARGET_ARCH ?= $(HOST_ARCH)

    仅支持x86_64

    4

    #operating system

    HOST_OS := $(shell uname -s 2>/dev/null | tr "[:upper:]" "[:lower:]")

    TARGET_OS ?= $(HOST_OS)

    初始支持的操作系统为Ubuntu 18.04。

    其他操作系统将会按需支持。

    5

    # host compiler

    HOST_COMPILER ?= mxcc

    6

    # Device compiler

    MXCC          := mxcc

    7

    # Internal flags

    MXCCFLAGS     := -x maca

    8

    #Install directory

    MACA_INSTALL_TARGET_DIR := /opt/maca/bin

    示例项目不会使用此选项

  3. 参考 2.3.2.1 用参考示例项目的Makefile构建MXMACA程序,构建MXMACA程序并清除构建MXMACA程序时生成的项目文件。

3. 编程模型

本章节描述了MXMACA编程模型的几个主要概念。

关于MXMACA C++的详细描述,参见 4 编程接口

3.1. GPGPU

GPU的处理内核远多于CPU。GPU最初用于图形处理,后来也用于向量计算和浮点运算,并逐渐用于很多高度并行计算的应用,进而衍生出了GPGPU,如图 3.1 所示。

_images/figure_3_1.png

图 3.1 CPU、GPU和GPGPU概念介绍

GPGPU擅长并行计算,分解是并行处理的核心。分解指的是:

  • 将算法划分为单独的任务

  • 将数据集划分为可并行操作的离散块

通常,应用程序由并行计算和顺序计算混合组成,因此系统采用GPU和CPU的混合设计,以最大限度地提高系统整体性能。

3.2. MXMACA:通用并行计算平台和编程模型

MXMACA® 是一个通用并行计算平台和编程模型,主要用于开发高度并行性的应用程序并部署在沐曦GPU上。

MXMACA的软件环境允许开发人员使用C++作为高级编程语言。MXMACA软件栈如图 3.2 所示。

_images/figure_3_2.png

图 3.2 MXMACA软件栈

MXMACA支持使用C/C++编程语言,且包括以下功能:

  • Templates

  • C++11 Lambdas

  • Classes

  • namespaces等

使用mxcc编译MXMACA C++代码,构建在沐曦GPU平台上运行的MXMACA程序。MXMACA提供以下API接口:

  • MXMACA运行时库:实现MXMACA在功能模块上的运行时API,例如设备管理,流管理,内存管理,执行控制,事件管理等。

  • MXMACA人工智能和计算库(AI & Compute Library,ACL):为沐曦GPU定制的加速库,用于机器学习,数值分析和量子计算等现场应用。

MXMACA也为开发人员提供了一套专业的记录、跟踪、分析、部署和现场维护工具。

MXMACA平台支持多个GPU的并行计算,可以通过PCIe或MetaXLink在节点内,也可通过InfiniBand或以太网上的RDMA跨节点进行。 沐曦集合通信库(MetaX Collective Communication Library,MCCL)可用于多GPU编程,通过隐藏低级通信的细节来简化编程。

4. 编程接口

MXMACA C++为熟悉C++编程语言的用户提供了一种简单的途径,可以轻松编写由沐曦GPU设备执行的程序。MXMACA C++由C++语言的最小扩展集,MXMACA运行时API和MXMACA人工智能和计算库组成。

4.1. MXMACA C++语言扩展

MXMACA C++语言扩展允许程序员将核函数定义为 C++ 函数,并在每次调用函数时使用一些新句法来指定ND-Range和Workgroup维度。 任何包含这些扩展的源文件都必须使用mxcc进行编译,详情参见《曦云® 系列通用计算GPU mxcc编译器用户指南》。

4.2. MXMACA运行时API

MXMACA运行时API提供了在主机上执行的C和C++函数,用于分配和释放设备内存、在主机内存和设备内存之间传输数据以及管理具有多个设备的系统。 运行时API的详细介绍,参见《曦云® 系列通用计算GPU运行时API编程指南》。

4.3. MXMACA人工智能和计算库

支持的MXMACA人工智能和计算库,参见表 4.1

表 4.1 MXMACA人工智能和计算库

序号

MXMACA 库

描述

1

mcBLAS

基础线性代数程序集

2

mcFFT

快速傅里叶变换库

3

mcDNN

深度神经网络库

4

mcRAND

生成高质量伪随机和准随机数字

5

mcThrust

基于标准模板库的MXMACA C++模板库

6

mcCUB

C++头库,为MXMACA编程模型的每层提供可重用的软件组件

7

mcSPARSE

稀疏矩阵和向量的基本线性代数子程序

8

mcPyTorch

mcPyTorch基于PyTorch 2.0/2.1 版本,在MXMACA环境中运行,并支持CPU和MXMACA设备上的张量操作

9

mcSOLVER

基于mcBLAS和mcSPARSE库的高级包

4.4. 开发人工智能相关应用

开发人工智能相关应用,具体文档参见表 4.2

表 4.2 MXMACA人工智能相关应用开发文档

序号

开发文档

描述

1

AI推理用户手册

指导用户如何使用MacaRT推理引擎,将训练好的模型部署到曦云系列GPU上

2

AI训练用户手册

指导用户在AI训练的场景下,如何使用曦云系列GPU进行人工智能算法的训练

4.5. 视频编解码相关应用

开发视频编解码相关应用,具体文档参见表 4.3

表 4.3 MXMACA视频编解码相关应用开发文档

序号

开发文档

描述

1

视频编解码VPU编程指南

指导用户如何使用曦云系列GPU视频编解码VPU,进行硬件加速的软件开发方法

4.6. 开发数据中心相关应用

开发数据中心相关应用的文档,具体文档参见表 4.4

表 4.4 MXMACA数据中心相关应用开发文档

序号

开发文档

描述

1

mcDF使用手册

指导用户在曦云系列GPU上安装部署mcDF和使用mcDF

2

mcPy使用手册

指导用户在曦云系列GPU上安装部署mcPy和使用mcPy

3

mcFaiss使用手册

指导用户在曦云系列GPU上安装部署mcFaiss和使用mcFaiss

4

mxvs测试工具套件使用手册

沐曦验收测试套件(MetaX Validation Suite,mxvs)

5. 附录

5.1. 术语/缩略语

术语/缩略语

全称

描述

CMake

一个开源的跨平台安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)

GCC

GNU Compiler Collection

一个能够编译多种语言的编译器

GPGPU

General-Purpose GPU

通用GPU

KVM

Kernel Virtual Machine

基于内核的虚拟机,是一种内建于Linux的开源虚拟化技术

Make

一个智能的批处理工具,用于解释Makefile中的指令

Makefile

描述了整个代码工程所有文件的编译顺序、编译规则。Makefile有自己的书写格式、关键字、函数,可以使用系统shell所提供的任何命令来完成想要的工作

mxcc

MXMACA C/C++ Compiler

MXMACA软件栈中,针对MetaX GPU的硬件架构和功能特性设计和发布的编译器

MXMACA

MetaX Advanced Compute Architecture

沐曦推出的GPU软件栈,包含了沐曦GPU的底层驱动、编译器、数学库及整套软件工具套件