F3实例OpenCL开发流程

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍如何在F3实例上使用OpenCL(Open Computing Language)制作镜像文件,并烧录到FPGA芯片中。

前提条件

  • 已创建F3实例。

  • 已在F3实例所在的安全组中添加安全组规则,并放行SSH(22)端口。具体操作,请参见添加安全组规则

  • 已登录ECS管理控制台,并在F3实例的详情页上获取实例ID。

  • 已创建一个OSS Bucket专门用于FaaS服务。若尚未创建OSS Bucket,具体操作,请参见创建一个OSS Bucket

  • 已获取命令行工具faasutil。若尚未获取faasutil工具,具体操作,请参见获取faasutil

  • 使用RAM用户操作FPGA时,必须先完成以下操作:

    • 创建RAM用户并为RAM用户授权。具体操作,请参见创建RAM用户为RAM用户授权

      您需要为RAM用户授予AliyunOSSFullAccess权限。

    • 获取AccessKey ID和AccessKey Secret。具体操作,请参见创建AccessKey

      警告

      仅支持通过RAM用户的AccessKey使用FaaS服务,可有效降低AccessKey泄露的风险。强烈建议您不要将AccessKey ID和AccessKey Secret明文保存至工程代码里或者任何容易被他人明文获取到的地方,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

注意事项

  • 本文中所有操作都必须由同一个账号在同一地域里执行。

  • 如果您为普通用户,建议管理员将镜像中/root/xbinst_oem目录拷贝至用户根目录下。

  • 如果您为普通用户,请联系管理员给普通用户添加/dev/virtio-ports/FaaS.agent的使用权限。

  • 建议您使用RAM用户操作FaaS实例。您需要为FaaS管理账号创建一个角色,并授予临时权限,让FaaS管理账号能访问指定的OSS Bucket。

  • 本文以2018.2版本的SDAccel开发环境为例,若您使用其他版本的SDAccel开发环境,步骤和命令可能会稍有差异。

步骤一:配置环境

配置环境时,请注意以下事项:

  • 配置环境主要包括安装xocl驱动、设置vivado环境变量、检查vivado license、检测aliyun-f3 sdaccel平台、授予2018.2 runtime配置。

  • 如果您要运行vivado的仿真,请勿运行步骤2~步骤4的命令来配置环境,您只需要单独设置vivado环境变量即可。

  • 推荐您使用Makefile方式仿真。

  1. 远程登录F3实例。

    具体操作,请参见远程连接F3实例

    重要

    后面步骤中的编译工程可能会持续数小时,建议您使用screen或者nohup等方式登录,防止ssh超时退出。

  2. 运行以下命令,安装screen。

    yum install screen -y
  3. 运行以下命令,进入screen。

    screen -S f3opencl
  4. 运行以下命令,配置环境。

    # 每打开一个终端窗口就需要执行该命令一次。
    sudo source /home/user1/xbinst_oem/F3_env_setup.sh xocl
  5. 下载并安装补丁y2k22_patch-1.2.zip

    下载地址:Xilinx。其中,y2k22_patch-1.2.zip补丁用于修复Xilinx年限溢出缺陷。

步骤二:编译二进制文件

编译vadd二进制文件和kernel_global_bandwidth二进制文件的操作如下所示:

示例一:编译vadd二进制文件

  1. 复制examples目录。

    cp -rf /opt/Xilinx/SDx/2018.2/examples ./
  2. 进入vadd目录。

    cd examples/vadd/
  3. 运行以下命令,查看XDEVICE的值。

    cat sdaccel.mk | grep "XDEVICE="

    您需要确保XDEVICE配置为XDEVICE=xilinx_aliyun-f3_dynamic_5_0

  4. 修改common.mk文件。

    1. 运行以下命令,打开common.mk文件。

      vim ../common/common.mk
    2. 添加编译参数--xp param:compiler.acceleratorBinaryContent=dcp

      在文件代码中的第61行代码(参数可能在60~62行,视您的文件而定)末尾添加编译参数--xp param:compiler.acceleratorBinaryContent=dcp,修改后的代码如下所示。

      CLCC_OPT += $(CLCC_OPT_LEVEL) ${DEVICE_REPO_OPT} --platform ${XDEVICE} ${KERNEL_DEFS} ${KERNEL_INCS} --xp param:compiler.acceleratorBinaryContent=dcp
      说明

      由于您必须向编译服务器提交DCP文件,所以需要添加--xp param:compiler.acceleratorBinaryContent=dcp编译参数,使得Xilinx® OpenCL™ Compiler(xocc)编译生成一个布局布线后的DCP文件,而不是bit文件。

  5. 运行以下命令,编译程序。

    make -f sdaccel.mk xbin_hw
    重要

    编译过程可能会持续数个小时,请您耐心等待。

    显示结果如下所示,表示二进制文件(vadd)编译已经开始。f3_opencl_1

示例二:编译kernel_global_bandwidth二进制文件

  1. 依次运行以下命令,克隆xilinx 2018.2 examples

    git clone https://github.com/Xilinx/SDAccel_Examples.git
    cd SDAccel_Examples/
    git checkout 2018.2
    说明

    git分支必须为2018.2版本。

  2. 运行以下命令进入上述目录。

    cd getting_started/kernel_to_gmem/kernel_global_bandwidth
  3. 修改Makefile文件。

    1. 运行以下命令,打开Makefile文件。

      vim Makefile
    2. 设置DEVICES值,使得DEVICES=xilinx_aliyun-f3_dynamic_5_0

    3. 添加编译参数--xp param:compiler.acceleratorBinaryContent=dcp

      在文件代码的第33行代码末尾添加--xp param:compiler.acceleratorBinaryContent=dcp,修改后的代码如下所示。

      CLFLAGS +=--xp "param:compiler.acceleratorBinaryContent=dcp" --xp "param:compiler.preserveHlsOutput=1" --xp "param:compiler.generateExtraRunData=true" --max_memory_ports bandwidth -DNDDR_BANKS=$(ddr_banks)
  4. 运行以下命令,编译程序。

    重要

    编译过程可能会持续数小时,请您耐心等待。

    make TARGET=hw

    显示页面如下所示,表示二进制文件(kernel_global_bandwidth)编译已经开始。f3_opencl_2

步骤三:检查打包脚本

运行以下命令,检查打包脚本是否存在。

file /home/user1/xbinst_oem/sdaccel_package.sh

如果返回结果中包含cannot open (No such file or directory),说明不存在该文件,您需要运行以下命令手动下载打包脚本。

wget http://fpga-tools.oss-cn-shanghai.aliyuncs.com/sdaccel_package.sh

步骤四:制作镜像

  1. 初始化faasutil工具并配置OSS环境。

    1. 运行以下命令,设置RAM账号的AccessKey信息。

      # 将<HereIsYourSecretId>和<HereIsYourSecretKey>替换为您的RAM用户AK信息
      faasutil config --id=<HereIsYourSecretId> --key=<HereIsYourSecretKey>
    2. 运行以下命令,设置FaaS服务要使用的OSS Bucket。

      # 将<hereIsYourBucket>替换为您创建的OSS Bucket名称
      faasutil auth --bucket=<hereIsYourBucket>
  2. 运行以下命令,获取后缀为.xclbin的文件名。

    ls

    显示结果如下:

    f3_opencl_3

  3. 运行以下命令,打包好二进制文件。

    /home/user1/xbinst_oem/sdaccel_package.sh -xclbin=/opt/Xilinx/SDx/2018.2/examples/vadd/bin_vadd_hw.xclbin

    打包完成后,您会在同一目录下看到一个打包好的文件,如下图所示。f3_opencl_4

步骤五:下载镜像

本步骤介绍如何使用faasutil工具上传网表文件并下载FPGA镜像。关于faasutil命令的用法,请参见使用faasutil

  1. 依次运行以下命令,将压缩包上传和存放在OSS Bucket中。

    • 将压缩包上传到您个人的OSS Bucket

      faasutil put_object --object=bit.tar.gz --file=bit.tar.gz  #--object(Object file in oss bucket) --file(Local file need to put)

      显示结果如下所示:

      f3_0opencl

    • 将存放在您个人OSS Bucket中的压缩包上传到FaaS管理单元的OSS Bucket中

      faasutil create_image --object=bit.tar.gz --fpgatype=xilinx --name=<HereIsFPGAImageName> --tags=<HereIsFPGAImageTag> --encrypted=false --shell=<hereIsShellVersionOfFPGA>        # <HereIsFPGAImageTag>可选(镜像Tag)  encrypted可选,镜像加密   <HereIsShellVersionOfFPGA>默认版本 

      显示结果如下所示:

      f3_opencl-2

  2. 运行以下命令,查看FPGA镜像是否处于可下载状态。

    faasutil list_images

    在返回结果中:

    • 如果FPGA镜像的"State""compiling",表示FPGA镜像处于编译状态,您需要继续等待。

      image-1

    • 如果FPGA镜像的"State""success",表示FPGA镜像已经可以下载,您需要找到并记录FpgaImageUniqueId,用于后续下载镜像(download_image)时使用。image2

  3. 运行以下命令,在命令返回结果中,找到并记录fpga bdf

    faasutil list_instances

    image-5

  4. 运行以下命令,下载FPGA镜像。

    faasutil download_image --bdf=<fpga_bdf> --fpgaImageUniqueId=<image_uuid>  #<fpga_bdf>由上一步所得  <image_uuid>镜像uuid

    image-6

  5. 运行以下命令,查看镜像是否下载成功。

    faasutil fpga_status --bdf=<fpga_bdf>

    以下为返回结果示例。如果显示的imageuuid与您获取的FpgaImageUniqueId一致,并且fpgaStatus参数显示valid,说明镜像下载成功。image-7

步骤六:运行Host程序

  1. 运行以下命令,配置环境。

     # 每打开一个终端窗口就需要执行该命令一次
    sudo source /home/user1/xbinst_oem/F3_env_setup.sh xocl
  2. 配置sdaccel.ini文件。

    在host二进制文件所在目录下,运行以下命令,创建sdaccel.ini文件

    vim sdaccel.ini

    创建sdaccel.ini文件后,需要输入下列内容。

    [Debug]
    profile=true
    [Runtime]
    runtime_log = "run.log"
    hal_log = hal.log
    ert=false
    kds=false
  3. 运行以下命令,运行host程序。

    • vadd运行命令如下:

      make -f sdaccel.mk host
      sudo ./vadd bin_vadd_hw.xclbin
    • kernel_global_bandwidth运行命令如下:

      sudo ./kernel_global

    如果返回结果中出现Test Passed,说明测试通过。

常用操作

这里介绍FPGA实例的部分常用操作。

任务

命令

查看帮助文档

make -f ./sdaccel.mk help

软件仿真

make -f ./sdaccel.mk run_cpu_em

硬件仿真

make -f ./sdaccel.mk run_hw_em

只编译host代码

make -f ./sdaccel.mk host

编译生成可以下载的文件

make -f sdaccel.mk xbin_hw

清理工作目录

make -f sdaccel.mk clean

强力清除工作目录

make -f sdaccel.mk cleanall

说明
  • 仿真时只需要按照Xilinx标准流程操作,不需要配置F3_env_setup环境。

  • SDAccel runtime和SDAccel开发平台已在阿里云F3官方镜像中提供,您也可以直接下载SDAccel runtimeSDAccel开发平台