ベアメタル用のホスト プログラミング - 2023.2 日本語

AI エンジン ツールおよびフロー ユーザー ガイド (UG1076)

Document ID
UG1076
Release Date
2023-12-04
Version
2023.2 日本語

AMD は、ベアメタル/スタンドアロン環境でのアプリケーション開発向けに作業負荷を軽減するためのスタンドアロン ボード サポート パッケージ (BSP)、ドライバー、ライブラリを提供しています。Linux 上のホスト プログラム で説明されているように、ベアメタル システムの最上位アプリケーションに AI エンジン グラフ カーネルと PL カーネルも統合して管理する必要があります。

ヒント: ベアメタル システムを AI エンジン グラフおよび PL カーネルと統合する手順は、 『Vitis 統合ソフトウェア プラットフォーム資料: アプリケーション アクセラレーション開発』 (UG1393)ベアメタル システムのビルドベアメタル システムの作成を参照してください。
図 1. AI エンジンのベアメタル ソフトウェア スタック

ベアメタル システム用の最上位アプリケーション (main.cpp) の例を次に示します。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include "platform.h"
#include "xparameters.h"
#include "xil_io.h"
#include "xil_cache.h"
#include "graph.cpp"
......
#define MM2S_BASE XPAR_MM2S_S_AXI_CONTROL_BASEADDR
#define S2MM_BASE XPAR_S2MM_S_AXI_CONTROL_BASEADDR
#define MEM_OFFSET 0x10
#define SIZE_OFFSET 0x1C
#define CTRL_OFFSET 0x0

int RunTest(uint64_t mm2s_base, uint64_t s2mm_base, int32_t* in, int32_t* golden, 
    int32_t* out, int input_size, int output_size)
{
    int i;
    int errCount = 0;
    uint64_t memAddr = (uint64_t)in;
    uint64_t mem_outAddr = (uint64_t)out;

    printf("Starting test w/ cu\n");
    printf("Starting mm2s & s2mm\n");
    Xil_Out32(mm2s_base + MEM_OFFSET, (uint32_t) memAddr);
    Xil_Out32(mm2s_base + MEM_OFFSET + 4, 0);
    Xil_Out32(s2mm_base + MEM_OFFSET, (uint32_t) mem_outAddr);
    Xil_Out32(s2mm_base + MEM_OFFSET + 4, 0);
    Xil_Out32(mm2s_base + SIZE_OFFSET, input_size);
    Xil_Out32(s2mm_base + SIZE_OFFSET, output_size);
    Xil_Out32(mm2s_base + CTRL_OFFSET, 1);
    Xil_Out32(s2mm_base + CTRL_OFFSET, 1);

    printf("GRAPH INIT\n");
    clipgraph.init();

    printf("GRAPH RUN\n");
    clipgraph.run();

    //Wait for s2mm to be done  
    while(1) {
        uint32_t v = Xil_In32(s2mm_base + CTRL_OFFSET);
        if(v & 6) {
            break;
        }
    }

    printf("PLIO IP DONE!\n");

    for(i = 0; i < output_size; i++) {
        if((((int32_t*)out)[i] != ((int32_t*)golden)[i]) ) {
            printf("Error found in sample %d != to the golden %d\n", i+1, ((int32_t*)out)[i], ((int32_t*)golden)[i]);
            errCount++;
        }
        else
            printf("%d\n ",((int32_t*)out)[i]);
    }

    printf("Ending test w/ cu\n");
    return errCount;
}

int main()
{
    int i;
    int32_t* out;
    int errCount;

    Xil_DCacheDisable();
    init_platform();
    sleep(1);
    
    printf("Beginning test\n");
    //Preparing data  
    ......

    //Run PL kernels & AIE & Verification
    errCount = RunTest(MM2S_BASE, S2MM_BASE, (int32_t*)cint16input, int32golden, out, INPUT_SIZE, OUTPUT_SIZE);

    //Post-Processing
    if(errCount == 0)
        printf("Test passed. \n");
    else
        printf("Test failed! Error count: %d \n",errCount);

    cleanup_platform();
    return errCount;
}

コード例の手順は次のとおりです。

  • main() 関数は、プラットフォームとデータを初期化してテストを実行し、リターン コードを検証してエラー コードを返します。
  • #include "graph.cpp" には、グラフ オブジェクト clipgraph をインスタンシエートするためのコードが記載されています。graph.cppaiecompiler とシミュレーションで使用したものと同じですが、マクロ __AIESIM__ および __X86SIM__ によって保護できます。これらマクロの使用法は、マクロ で説明しています。
  • Xil_DCacheDisable() は、データ キャッシュをディスエーブルにします。API 間でデータが同期していることを確認するために不可欠です。
  • RunTest() は、処理に必要なデータをカーネルに送信して、結果を返します。
  • Xil_Out32 は、PL カーネルを制御するためにレジスタに書き込みます。詳細は、以降のセクションで説明します。
  • clipgraph.init() はグラフを初期化します。
  • clipgraph.run() はグラフを開始します。

上記のコード例は、ベアメタル BSP から自動生成される xparameters.h を参照しています。アプリケーションは、すべてのドライバーのメモリ マップド アドレスが正しく割り当てられるように、ベアメタル BSP の適切な生成を管理する必要があります。

xil_io.h には、一般的なドライバー I/O API が含まれます。これは、ドライバー アクセスに推奨される方法です。