FC2カウンター FPGAの部屋 2022年11月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vitis HLS 2022.2 の新機能を確かめる4(performance プラグマ4)

Vitis HLS 2022.2 の新機能を確かめる3(performance プラグマ3)”の続き。

What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみようということで、前回は、、より performance プラグマを評価するために、ソフトウエアとして書いた AXI4 Master アクセスベースの sobel_fil_axim.cpp とそのテストベンチ、Vitis HLS プロジェクトを表示した。今回は、performance プラグマなしとありの状態で、C コードの合成を行って比較した。

まずは”Vitis HLS 2022.2 の新機能を確かめる3(performance プラグマ3)”のソースコードのままに performance プラグマなしでやってみよう。

C シミュレーションを行った。
Vitis_HLS_2022_2_22_221129.png

csim/build ディレクトリに sobel.jpg が生成されている。
Vitis_HLS_2022_2_30_221130.png

C コードの合成を行った。
ループのインターバルは 8 クロックだった。全体のレイテンシは、3940046 クロックだった。
Vitis_HLS_2022_2_23_221130.png

C/RTL 協調シミュレーションを行った。時間が掛かった。
レイテンシは 6566938 クロックだった。6566938(クロック) / 480000(ピクセル) ≒ 13.68 クロック/ピクセルだった。
Vitis_HLS_2022_2_24_221130.png

C/RTL 協調シミュレーションの拡大した波形を示す。
Vitis_HLS_2022_2_25_221130.png

AXI4 Master Write の間に 18 個の ARVALID が入っている。
1 個の ARVALID には、7 個の RVALID が入っているので、 18 x 7 = 126 個の AXI4 Master Read アクセスが入っているようだ。
Vitis_HLS_2022_2_26_221130.png

次に、”#pragma HLS performance target_ti=800”を入れて、C コードの合成を行った。
結果は performance プラグマを入れていない時と同じリソース使用量、レイテンシだった。何も変わっていないようだ。
Vitis_HLS_2022_2_28_221130.png

Pragma Report を見ると、8000 クロック未満に設定する必要があるようだ。
Vitis_HLS_2022_2_29_221130.png

performance プラグマを使える用途がまだ良く分からない。
  1. 2022年11月30日 04:51 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2022.2 の新機能を確かめる3(performance プラグマ3)

Vitis HLS 2022.2 の新機能を確かめる2(performance プラグマ2)”の続き。

What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみようということで、前回は、performance プラグマが無くても、その他のパフォーマンスに関係するプラグマが無くても、ソーベル・フィルタのソースコードでループ回数を固定すると、1 クロックで 1 ピクセル処理をパフォーマンスに関するプラグマなしの状態で達成できた。今回は、より performance プラグマを評価するために、ソフトウエアとして書いた AXI4 Master アクセスベースの sobel_fil_axim.cpp とそのテストベンチ、Vitis HLS プロジェクトを示す。

Vitis HLS 2022.2 で sobel_fil_axim プロジェクトを作成した。
Vitis_HLS_2022_2_20_221129.png

今回のテストベンチ・コードでは OpenCV ライブラリを使用している。
Vitis HLS 2022.2 には内蔵された OpenCV は無いので、別にインストールした OpenCV を指定する。
Vitis HLS の Project メニューから Project Settings... を選択して、Project Settings ダイアログを開いた。
Simulation タブを開いて、sobel_fil_axim_tb.cpp の CFLAGS に

-I/usr/local/include

を設定した。
なお、Vitis HLS 2022.2 では、CFLAG が絶対パスのままになっている。やっとバグが直ったようだ。

Linker Flags に

-L/usr/local/lib -lopencv_core -lopencv_imgcodecs -lopencv_imgproc

を設定した。
Vitis_HLS_2022_2_21_221129.png

ソースコードの sobel_fil_axim.cpp を示す。

// sobel_fil_axim.cpp
// 2022/11/28 by marsee

#include <stdint.h>

int32_t sobel_fil(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2);
int32_t conv_rgb2y(int32_t rbg);
int32_t square_root8(int32_t val);

#define ROW_SIZE    600
#define COL_SIZE    800
#define HORIZONTAL  0
#define VERTICAL    1

int sobel_fil_axim(int32_t *cam_fb, int32_t *sobel_fb){
#pragma HLS INTERFACE mode=s_axilite port=return
#pragma HLS INTERFACE mode=m_axi depth=480000 port=cam_fb offset=slave
#pragma HLS INTERFACE mode=m_axi depth=480000 port=sobel_fb offset=slave
    int32_t sobel_val, sobel_h_val, sobel_v_val;
    int32_t pix[3][3];

    for(int y=0; y<ROW_SIZE; y++){
//#pragma HLS performance target_ti=800
        for(int x=0; x<COL_SIZE; x++){
            for(int i=2; i>=0; --i){
                for(int j=2; j>=0; --j){
                    if(x>=2 && y>=2)
                        pix[i][j] = conv_rgb2y(cam_fb[(y-i)*COL_SIZE+(x-j)]);
                    else
                        pix[i][j] = 0;
                }
            }
            sobel_h_val = sobel_fil(HORIZONTAL, pix[0][0], pix[0][1], pix[0][2],
                                                pix[1][0], pix[1][1], pix[1][2],
                                                pix[2][0], pix[2][1], pix[2][2]);
            sobel_v_val = sobel_fil(VERTICAL,   pix[0][0], pix[0][1], pix[0][2],
                                                pix[1][0], pix[1][1], pix[1][2],
                                                pix[2][0], pix[2][1], pix[2][2]);
            sobel_val = square_root8(sobel_h_val*sobel_h_val + sobel_v_val*sobel_v_val);
            if(x<2 || y<2)
                sobel_val = 0;
            sobel_fb[y*COL_SIZE+x] = (sobel_val<<16)+(sobel_val<<8)+sobel_val;
        }
    }
    return(0);
}

// RGBからYへの変換
// RGBのフォーマットは、{R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int32_t conv_rgb2y(int32_t rgb){
    int32_t r, g, b, y_f;
    int32_t y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// sobel filter
// HORZONTAL
// x0y0 x1y0 x2y0  1  2  1
// x0y1 x1y1 x2y1  0  0  0
// x0y2 x1y2 x2y2 -1 -2 -1
// VERTICAL
// x0y0 x1y0 x2y0  1  0 -1
// x0y1 x1y1 x2y1  2  0 -2
// x0y2 x1y2 x2y2  1  0 -1
int32_t sobel_fil(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2){
    int32_t y;

    if(h_or_v == HORIZONTAL){
        y = x0y0 + 2*x1y0 + x2y0 - x0y2 - 2*x1y2 - x2y2;
    } else {
        y = x0y0 - x2y0 + 2*x0y1 - 2*x2y1 + x0y2 - x2y2;
    }
    if(y<0)
        y = -y;
        //y = 0;
    else if(y>255) // 8 bits
        y = 255;
    return(y);
}

// square_root8
// 8 bit幅のsquare_rootを求める
int32_t square_root8(int32_t val){
    int32_t temp = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }

    return(temp);
}


ソースコードの sobel_fil_axim_tb.cpp を示す。

// sobel_fil_axim_tb.cpp
// 2022/11/29 by marsee

#include <stdio.h>
#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include "opencv2/opencv.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgcodecs/imgcodecs.hpp"

#define HORIZONTAL  0
#define VERTICAL    1

int sobel_fil_axim(int32_t *cam_fb, int32_t *sobel_fb);
int sobel_filter_soft(int32_t *cam_fb, int32_t *sobel_fb,
        int32_t x_size, int32_t y_size);
int32_t square_root8_soft(int32_t val);
int32_t sobel_fil_soft(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2);
int32_t conv_rgb2y_soft(int32_t rbg);

const char INPUT_JPG_FILE[] = "test2.jpg";
const char OUTPUT_JPG_FILE[] = "sobel.jpg";

int main(){
    // JPG ファイルをMat に読み込む
    cv::Mat img = cv::imread(INPUT_JPG_FILE);

    // ピクセルを入れる領域の確保
    std::vector<int32_t> rd_bmp(sizeof(int32_t)*img.cols*img.rows);
    std::vector<int32_t> hw_sobel(sizeof(int32_t)*(img.cols)*(img.rows));
    std::vector<int32_t> sw_sobel(sizeof(int32_t)*(img.cols)*(img.rows));

    // rd_bmp にJPGのピクセルを代入
    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for (int y=0; y<img.rows; y++){
        for (int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            pixel = dst_vec3b(y,x);
            rd_bmp[y*img.cols+x] = (pixel[0] & 0xff) | ((pixel[1] & 0xff)<<8) | ((pixel[2] & 0xff)<<16); // RGB 8 bits
            // blue - pixel[0]; green - pixel[1]; red - pixel[2];
        }
    }

    sobel_fil_axim(rd_bmp.data(), hw_sobel.data()); // ハードウェアのソーベルフィルタ
    sobel_filter_soft(rd_bmp.data(), sw_sobel.data(), img.cols, img.rows);  // ソフトウェアのソーベルフィルタ

    // ハードウェアとソフトウェアのソーベルフィルタの値のチェック
    for (int y=0; y<img.rows; y++){
        for (int x=0; x<img.cols; x++){
            if (hw_sobel[y*img.cols+x] != sw_sobel[y*img.cols+x]){
                printf("ERROR HW and SW results mismatch x = %ld, y = %ld, HW = %x, SW = %x\n",
                        x, y, hw_sobel[y*img.cols+x], sw_sobel[y*(img.cols-2)+x]);
                return(1);
            }
        }
    }
    printf("Success HW and SW results match\n");

    const int sobel_row = img.rows;
    const int sobel_cols = img.cols;
    cv::Mat wbmpf(sobel_row, sobel_cols, CV_8UC3);
    // wbmpf にsobel フィルタ処理後の画像を入力
    cv::Mat_<cv::Vec3b> sob_vec3b = cv::Mat_<cv::Vec3b>(wbmpf);
    for (int y=0; y<wbmpf.rows; y++){
        for (int x=0; x<wbmpf.cols; x++){
            cv::Vec3b pixel;
            pixel = sob_vec3b(y,x);
            int32_t rbg = hw_sobel[y*wbmpf.cols+x];
            pixel[0] = ((rbg >> 8) & 0xff); // blue
            pixel[1] = (rbg & 0xff); // green
            pixel[2] = ((rbg >> 16) & 0xff); // red
            sob_vec3b(y,x) = pixel;
        }
    }

    // ハードウェアのソーベルフィルタの結果を jpg ファイルへ出力する
    cv::imwrite(OUTPUT_JPG_FILE, wbmpf);

    return(0);
}

int sobel_filter_soft(int32_t *cam_fb, int32_t *sobel_fb,
    int32_t x_size, int32_t y_size){
    int32_t sobel_val, sobel_h_val, sobel_v_val;
    int32_t pix[3][3];

    for(int y=0; y<y_size; y++){
        for(int x=0; x<x_size; x++){
            for(int i=2; i>=0; --i){
                for(int j=2; j>=0; --j){
                    if(x>=2 && y>=2)
                        pix[i][j] = conv_rgb2y_soft(cam_fb[(y-i)*x_size+(x-j)]);
                    else
                        pix[i][j] = 0;
                }
            }
            sobel_h_val = sobel_fil_soft(HORIZONTAL,pix[0][0], pix[0][1], pix[0][2],
                                                    pix[1][0], pix[1][1], pix[1][2],
                                                    pix[2][0], pix[2][1], pix[2][2]);
            sobel_v_val = sobel_fil_soft(VERTICAL,  pix[0][0], pix[0][1], pix[0][2],
                                                    pix[1][0], pix[1][1], pix[1][2],
                                                    pix[2][0], pix[2][1], pix[2][2]);
            sobel_val = square_root8_soft(sobel_h_val*sobel_h_val + sobel_v_val*sobel_v_val);
            if(x<2 || y<2)
                sobel_val = 0;
            sobel_fb[y*x_size+x] = (sobel_val<<16)+(sobel_val<<8)+sobel_val;
        }
    }
    return(0);
}

// RGBからYへの変換
// RGBのフォーマットは、{R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int32_t conv_rgb2y_soft(int32_t rgb){
    int32_t r, g, b, y_f;
    int32_t y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}
// sobel filter
// HORZONTAL
// x0y0 x1y0 x2y0  1  2  1
// x0y1 x1y1 x2y1  0  0  0
// x0y2 x1y2 x2y2 -1 -2 -1
// VERTICAL
// x0y0 x1y0 x2y0  1  0 -1
// x0y1 x1y1 x2y1  2  0 -2
// x0y2 x1y2 x2y2  1  0 -1
int32_t sobel_fil_soft(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2){
    int32_t y;

    if(h_or_v == HORIZONTAL){
        y = x0y0 + 2*x1y0 + x2y0 - x0y2 - 2*x1y2 - x2y2;
    } else {
        y = x0y0 - x2y0 + 2*x0y1 - 2*x2y1 + x0y2 - x2y2;
    }
    if(y<0)
        y = -y;
        //y = 0;
    else if(y>255)
        y = 255;
    return(y);
}

// square_root8_soft
// 8 bit幅のsquare_rootを求める
int32_t square_root8_soft(int32_t val){
    int32_t temp = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }

    return(temp);
}

  1. 2022年11月29日 05:21 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2022.2 の新機能を確かめる2(performance プラグマ2)

Vitis HLS 2022.2 の新機能を確かめる1(performance プラグマ)”の続き。

What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみようということで、前回は、 performance プラグマについて調査した。今回は、 performance プラグマの続きをやってみる。

performance プラグマを入れた場合は、C コードの合成を行った時の Synthesis Summary Report の Pragma Report に次の記述があった。

Cannot apply performance pragma target_ti=800 cycles for loop 'LOOP_Y' in function 'sobel_axis_RGB24'. The target requires a pipeline II less than the minimal achievable II of 4 determined by the number of conflicting accesses on local memory 'tmp.i.i47' (4 per iteration), the number of conflicting accesses on local memory 'tmp.i.i29' (4 per iteration), the number of conflicting accesses on local memory 'tmp.i.i192' (4 per iteration)


Vitis_HLS_2022_2_17_221128.png

performance プラグマを正しく評価したいということで、”What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”の例と同じように、ループの回数を固定にして、sobel_axis_RGB24 関数を書き換えた。なお、パフォーマンスに関わるプラグマはコメントアウトした。

// sobel_axis_RGB24.cpp
// 2022/03/20 by marsee
// Up to HD resolution
// 2022/03/23 : Added keep and strb
// 2022/03/26 : axi_vdma と axi dma 用に分けた
// 2022/11/27 : perfomance プラグマを追加
// 2022/11/28 : row_size を 600、col_size を 800 に固定した

#include <stdint.h>
#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

#include "sobel_axis_RGB24.h"

ap_int<32> sobel_fil(ap_int<32> h_or_v, ap_int<32> x0y0, ap_int<32> x1y0, ap_int<32> x2y0, ap_int<32> x0y1,
        ap_int<32> x1y1, ap_int<32> x2y1, ap_int<32> x0y2, ap_int<32> x1y2, ap_int<32> x2y2);
ap_int<32> conv_rbg2y(ap_int<32> rbg);
ap_int<32> square_root8(ap_int<32> val);

#define row_size 600
#define col_size 800

int sobel_axis_RGB24(hls::stream<ap_axiu<24,1,1,1> >& ins,
        hls::stream<ap_axiu<24,1,1,1> >& outs, int32_t function){
#pragma HLS INTERFACE mode=s_axilite port=function
#pragma HLS INTERFACE mode=axis register_mode=both port=outs register
#pragma HLS INTERFACE mode=axis register_mode=both port=ins register
#pragma HLS INTERFACE mode=s_axilite port=return

    ap_axiu<24,1,1,1> pix;
    ap_axiu<24,1,1,1> sobel;
    ap_int<32> sobel_val, sobel_h_val, sobel_v_val;

    ap_int<32> line_buf[2][1920]; // Up to HD resolution
//#pragma HLS array_partition variable=line_buf block factor=2 dim=1

    ap_int<32> pix_mat[3][3];
//#pragma HLS array_partition variable=pix_mat complete

    LOOP_WAIT_USER : do {   // user が 1になった時にフレームがスタートする
#pragma HLS LOOP_TRIPCOUNT min=1 max=1 avg=1
        ins >> pix;
        if(function==ORG_IMGwAxiDma || function==SOBELwAxiDma)
            break;
    } while(pix.user == 0);

    LOOP_Y: for(int y=0; y<row_size; y++){
#pragma HLS LOOP_TRIPCOUNT avg=600 max=600 min=600
//#pragma HLS performance target_ti=800
        LOOP_X: for(int x=0; x<col_size; x++){
#pragma HLS LOOP_TRIPCOUNT avg=800 max=800 min=800
//#pragma HLS PIPELINE II=1
            if (!(x==0 && y==0))    // 最初の入力はすでに入力されている
                ins >> pix; // AXI4-Stream からの入力

            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            ap_int<32> y_val = conv_rbg2y(pix.data);
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            sobel_h_val = sobel_fil(HORIZONTAL, pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_v_val = sobel_fil(VERTICAL,   pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_val = square_root8(sobel_h_val*sobel_h_val + sobel_v_val*sobel_v_val);
            sobel.data = (sobel_val<<16)+(sobel_val<<8)+sobel_val;

            if(x<2 || y<2)
                sobel.data = 0;

            if(function==ORG_IMGwAxiVdma || function == SOBELwAxiVdma){
                if(x==0 && y==0) // 最初のピクセル
                    sobel.user = 1;
                else
                    sobel.user = 0;
                if(x == (col_size-1)) // 行の最後
                    sobel.last = 1;
                else
                    sobel.last = 0;
            }else{
                sobel.user = 0;
                sobel.last = pix.last;
            }
            sobel.keep = 0x7;
            sobel.strb = 0x7;
            if(function==SOBELwAxiVdma || function==SOBELwAxiDma)
                outs << sobel;
            else
                outs << pix;
        }
    }
    return(0);
}

// RBGからYへの変換
// RBGのフォーマットは、{R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
ap_int<32> conv_rbg2y(ap_int<32> rbg){
    ap_int<32> r, g, b, y_f;
    ap_int<32> y;

    b = rbg & 0xff;
    g = (rbg>>8) & 0xff;
    r = (rbg>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// sobel filter
// HORZONTAL
// x0y0 x1y0 x2y0  1  2  1
// x0y1 x1y1 x2y1  0  0  0
// x0y2 x1y2 x2y2 -1 -2 -1
// VERTICAL
// x0y0 x1y0 x2y0  1  0 -1
// x0y1 x1y1 x2y1  2  0 -2
// x0y2 x1y2 x2y2  1  0 -1
ap_int<32> sobel_fil(ap_int<32> h_or_v, ap_int<32> x0y0, ap_int<32> x1y0, ap_int<32> x2y0, ap_int<32> x0y1,
        ap_int<32> x1y1, ap_int<32> x2y1, ap_int<32> x0y2, ap_int<32> x1y2, ap_int<32> x2y2){
    ap_int<32> y;

    if(h_or_v == HORIZONTAL){
        y = x0y0 + 2*x1y0 + x2y0 - x0y2 - 2*x1y2 - x2y2;
    } else {
        y = x0y0 - x2y0 + 2*x0y1 - 2*x2y1 + x0y2 - x2y2;
    }
    if(y<0)
        y = -y;
        //y = 0;
    else if(y>255) // 8 bits
        y = 255;
    return(y);
}

// square_root8
// 8 bit幅のsquare_rootを求める
ap_int<32> square_root8(ap_int<32> val){
    ap_int<32> temp = 0;
    ap_int<32> square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }

    return(temp);
}


このソースコードで C コードの合成を行った。
結果を示す。
Vitis_HLS_2022_2_18_221128.png

1 クロックで 1 ピクセル処理をパフォーマンスに関するプラグマなしの状態で達成できてしまった。
Vitis HLS も進化しているのだね。
このソースコードは、ハードウエアを想定しているコードなので、想定していないコードで試す必要があるようだ。

C/RTL 協調シミュレーションを行ったが、問題なく 1 クロックで 1 ピクセル処理をパフォーマンスに関するプラグマなしの状態で達成できている。
Vitis_HLS_2022_2_19_221128.png
  1. 2022年11月28日 04:56 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

Vitis HLS 2022.2 の新機能を確かめる1(performance プラグマ)

What’s New in the Vitis HLS Tool 2022.2 – Key Feature Enhancements”を参考に、Vitis HLS 2022.2 の新機能を確かめてみよう。最初は performance プラグマだ。

RGB 24 ビット・データ入出力対応のソーベル・フィルタを KV260 で試してみよう。
Vitis HLS 2022.2 で Vitis_HLS/KIRA_KV260/2022.2/sobel_axis_RGB24 プロジェクトを作成したのだが、以前はダメだったPart 指定時のボードの指定ができるようになったようだ。
Vitis_HLS_2022_2_1_221127.png

さて、ソースコードは”RGB 24 ビット・データ入出力対応のソーベル・フィルタを Vitis HLS 2021.2 で作成する3”で使用したソースコードをそのまま使用したが、array_partition、PIPELINE プラグマはコメントアウトした。
Vitis_HLS_2022_2_2_221127.png

このソースコードで C コードの合成を行った。結果を示す。
Vitis_HLS_2022_2_3_221127.png

Performance & Resouce Estimates の sobel_axis_RGB_Pipelinue_LOOP_Y_LOOP_X の LOOP_Y_LOOP_X のインターバルは 2 になっている。1 にする必要がある。
しかし、プラグマを入れなくても Vitis HLS はだいぶ性能がチューニングされているな。。。

次に、LOOP_X の前の行に”#pragma HLS performance target_ti=800”を挿入した。
Vitis_HLS_2022_2_4_221127.png

C コードの合成を行った。結果を示す。
結果は変わらなかった。
Vitis_HLS_2022_2_5_221127.png

line_buf[2][1920] の ”#pragma HLS array_partition variable=line_buf block factor=2 dim=1”を挿入した。
Vitis_HLS_2022_2_6_221127.png

C コードの合成を行った。結果を示す。
レイテンシが短くなって約半分になった。
Vitis_HLS_2022_2_7_221127.png

paformance プラグマだけを入れた時の Function Call Graph (左側)と更に array_partition プラグマを入れた時の Function Call Graph (右側)を示す。
Vitis_HLS_2022_2_8_221127.pngVitis_HLS_2022_2_9_221127.png

paformance プラグマだけを入れて C/RTL 協調シミュレーションを行った。
やはり、2 クロックで 1 ピクセル処理となっていた。
Vitis_HLS_2022_2_10_221127.png

C/RTL 協調シミュレーション波形を示す。
Vitis_HLS_2022_2_11_221127.png

paformance プラグマと array_partition プラグマを入れて C/RTL 協調シミュレーションを行った。
1 クロックで 1 ピクセルの処理ができている。
Vitis_HLS_2022_2_12_221127.png

C/RTL 協調シミュレーション波形を示す。
Vitis_HLS_2022_2_13_221127.png

paformance プラグマだけを入れた時の Implementation 結果 (左側)と更に array_partition プラグマを入れた時の Implementation 結果 (右側)を示す。
Vitis_HLS_2022_2_14_221127.pngVitis_HLS_2022_2_15_221127.png

このソースコードでは、performance プラグマは効いていないようだ。しかし、Vitis HLS 2022.2 は最初からかなり最適化が効いている。
  1. 2022年11月27日 06:55 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:0

”実践的!FPGA開発セミナー vol.16”のスライド PDF を公開します

”実践的!FPGA開発セミナー vol.16”のスライド PDF を公開します。

今日は時間の関係上、すべてのスライドを説明できないかもしれません?もしくはさらっと流す可能性があります。
スライドには該当するFPGAの部屋のブログ記事へのリンクが張ってあるので、リンクをクリックしてより詳しい説明をご覧ください。

本日はよろしくお願いいたします。
  1. 2022年11月24日 17:00 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

”実践的!FPGA開発セミナー vol.16”で発表します

今日、”実践的!FPGA開発セミナー vol.16”が開催されますが、そこで私が発表します。
皆さん、よろしくお願いいたします。

題は、”Vitisをエッジで思う存分活用したい。。。w”です。近頃ブログで書いている Vitis のアクセラレーション・アプリケーションの話題をお話ししたいと思います。

ふるってご参加ください。まだ申し込み可能かもしれません?
なお、午後 5 時ころに今日の発表スライド PDF を公開します。
  1. 2022年11月24日 04:51 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する15

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する14”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、できあがった compiled ディレクトリを KV260 の Petalinux 2022.1 にアップロードした。アプリケーション・ソフトウエアを git clone し、ビルドした。古いモジュールをアンロードして、dpuprj をロードした。アプリケーション・ソフトウエアを実行したところ成功した。今回は、前回までで”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”のチュートリアルは成功した。そこで、kv260_median アクセラレーション・プラットフォームに含まれるメディアン・フィルタを使って、ノイズを除去してから YOLOV4 で物体を認識してみたところ成功した。

前回使用したソフトウエアは vitis_ai_dpu_yolo/demo_yolov4.cpp だが、これをベースに”kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる23”の median_pf.cpp のコードを追加して、median_demo_yolov4.cpp を作成した。

build.sh は demo_yolov4 を median_demo_yolov4 に置換して、使用する。

KV260 の Petalinux 2022.1 の ~/kv260_median/dpu ディレクトリに vitis_ai_dpu_median_yolo ディレクトリを作成した。
kv260_median_DPU_113_221123.png

vitis_ai_dpu_median_yolo ディレクトリに median_demo_yolov4.cpp と変更した build.sh を用意した。
ノイズ入りの test2.jpg をコピーした。

vitis_ai_dpu_median_yolo ディレクトリに u-dma-buf.ko を用意した。

ビルドを行った。
cd ~/kv260_median/dpu/vitis_ai_dpu_median_yolo
sh build.sh


median_demo_yolov4 実行形式ファイルが生成された。

アプリケーションを動作させるには /run/media/mmcblk0p1/ 以下にも dpu.xclbin が存在している必要があるそうなのでコピーする。
sudo mkdir -p /run/media/mmcblk0p1/
sudo cp dpu.xclbin /run/media/mmcblk0p1/


u-dma-buf をロードする。
sudo insmod u-dma-buf.ko udmabuf0=3000000

すでにロードされているハードウェアをアンロードして、dpuprj をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp dpuprj


ビルドで作成された demo_yolo4 を実行した。
sudo ./median_demo_yolov4 ../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel test2.jpg image
成功して result.jpg が生成された。
kv260_median_DPU_114_221123.png

xilinx-k26-starterkit-20221:~/kv260_median/dpu/vitis_ai_dpu_median_yolo$ sudo ./median_demo_yolov4 ../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel test2.jpg image
../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel test2.jpgModel Initialize Done
phys_addr = 40000000
in_img_total_bytes = 1441792
tvmonitor 0.985391 151.825 451.825 50.2466 335.823
tvmonitor 0.599225 0.870854 197.449 150.53 287.931
mouse 0.939509 462.855 526.316 313.673 346.846
mouse 0.877212 624.63 663.122 234.817 254.938
mouse 0.318674 621.84 666.77 227.559 259.926
keyboard 0.998828 277.435 500.512 314.605 444.413
cell phone 0.332537 354.317 476.452 415.798 503.778


kv260_median_DPU_115_221123.png

result.jpg を示す。
メガネケースは cell phone として認識されているようだ。
kv260_median_DPU_116_221123.jpg

median_demo_yolov4.cpp を貼っておく。公開を許可していただいた lp6m さんに感謝いたします。

// median_demo_yolo4.cpp
// 2022/11/23
// Combined demo_yolo4.cpp and median_pf.cpp.
// https://github.com/lp6m/vitis_ai_dpu_yolo/blob/master/demo_yolov4.cpp
// https://marsee101.blog.fc2.com/blog-entry-5747.html

#include <glog/logging.h>
#include <google/protobuf/text_format.h>

#include <cmath>
#include <iostream>
#include <numeric>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <vitis/ai/dpu_task.hpp>
#include <vitis/ai/nnpp/yolov3.hpp>
#include <fstream>
#include <map>
#include <vector>
#include <math.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*3)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0x2
#define S2MM_IDLE_MASK  0x2

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

volatile uint32_t *reg;

using namespace std;
using namespace cv;

// The parameters of yolov3_voc, each value could be set as actual needs.
// Such format could be refer to the prototxts in /etc/dpu_model_param.d.conf/.

const string readFile(const char *filename){
  ifstream ifs(filename);
  return string(istreambuf_iterator<char>(ifs),
                istreambuf_iterator<char>());
}

class YoloRunner{
  public:
    unique_ptr<vitis::ai::DpuTask> task;
    vitis::ai::proto::DpuModelParam modelconfig;
    cv::Size model_input_size;
    vector<vitis::ai::library::InputTensor> input_tensor;
    struct bbox{
      int label;
      float xmin;
      float ymin;
      float width;
      float height;
      float score;
      bbox(vitis::ai::YOLOv3Result::BoundingBox yolobbox, float img_width, float img_height){
        this->label = yolobbox.label;
        this->score = yolobbox.score;
        // does not clamp here
        this->xmin = yolobbox.x * img_width;
        this->ymin = yolobbox.y * img_height;
        this->width = yolobbox.width * img_width;
        this->height = yolobbox.height * img_height;
      }
    };

  public: YoloRunner(const char* modelconfig_path, const char* modelfile_path){
    const string config_str = readFile(modelconfig_path);
    auto ok = google::protobuf::TextFormat::ParseFromString(config_str, &(this->modelconfig));
    if (!ok) {
      cerr << "Set parameters failed!" << endl;
      abort();
    }
    this->task = vitis::ai::DpuTask::create(modelfile_path);
    this->input_tensor = task->getInputTensor(0u);
    int width = this->input_tensor[0].width;
    int height = this->input_tensor[0].height;
    this->model_input_size = cv::Size(width, height);
    this->task->setMeanScaleBGR({0.0f, 0.0f, 0.0f},
                        {0.00390625f, 0.00390625f, 0.00390625f});
  }
  private: cv::Mat Preprocess(cv::Mat img){
    cv::Mat resized_img;
    cv::resize(img, resized_img, this->model_input_size);
    return resized_img;
  }
  public: vector<bbox> Run(cv::Mat img){
    cv::Mat resized_img = this->Preprocess(img);
    vector<int> input_cols = {img.cols};
    vector<int> input_rows = {img.rows};
    vector<cv::Mat> inputs = {resized_img};
    task->setImageRGB(inputs);
    task->run(0);

    auto output_tensor = task->getOutputTensor(0u);
    auto results = vitis::ai::yolov3_post_process(
        input_tensor, output_tensor, this->modelconfig, input_cols, input_rows);
    auto result = results[0]; //batch_size is 1
    vector<bbox> bboxes;
    for(auto& yolobbox: result.bboxes){
      bboxes.push_back(bbox(yolobbox, img.cols, img.rows));
    }
    return bboxes;
  }

};

std::string get_basename(std::string& path) {
  int l = path.find_last_of('/')+1;
  int r = path.find_last_of('.');
    return path.substr(l, r-l);
}

map<string, string> bbox_to_map(YoloRunner::bbox bbox, int frame_id){
  map<string, string> res;
  res["frame_id"] = to_string(frame_id);
  res["prob"] = to_string(bbox.score);
  res["x"] = to_string(bbox.xmin);
  res["y"] = to_string(bbox.ymin);
  res["width"] = to_string(bbox.width);
  res["height"] = to_string(bbox.height);
  return res;
}

int main(int argc, char* argv[]) {
    int fd;
    volatile uint32_t *median_reg, *axi_dma_reg;
    volatile uint8_t *pict_buf;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    cv::Mat in_img, median_img;
    int fd_udmabuf;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;

    if (argc != 5) {
    cerr << "usage ./a.out config(.prototxt) modelfile(.xmodel) image(.jpg) image" << endl;
    }
    char* configfile  = argv[1];
    char* modelfile = argv[2];
    string img_or_video_file = string(argv[3]);

    cout << configfile << " " << modelfile << " " << img_or_video_file;
    auto runner = YoloRunner(configfile, modelfile);
    cout << "Model Initialize Done" << endl;
    std::string img_or_video_mode = std::string(argv[4]);
    if (img_or_video_mode == "image") {
        in_img = cv::imread(img_or_video_file);
        median_img.create(cv::Size(in_img.cols, in_img.rows), CV_8UC3);

        fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (fd == -1){
            fprintf(stderr, "/dev/mem open error\n");
            exit(-1);
        }
        
        // median_filter registers
        median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, MIDEAIN_REG_ADDR );
        if ((int64_t)median_reg == -1){
            fprintf(stderr,"/dev/mem map error for median_filter registers\n");
            exit(-1);
        }

        // axi_dma registers
        axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, AXI_DMA_REG_ADDR );
        if ((int64_t)axi_dma_reg == -1){
            fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
            exit(-1);
        }
        
        // udmabuf0
        fd_udmabuf = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
        if (fd_udmabuf == -1){
            fprintf(stderr, "/dev/udmabuf0 open errorn");
            exit(-1);
        }

        // phys_addr of udmabuf0
        fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
        if (fd_paddr == -1){
            fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
            exit(-1);
        }
        read(fd_paddr, (void *)attr, 1024);
        sscanf((const char *)attr, "%lx", &phys_addr);  
        close(fd_paddr);
        printf("phys_addr = %x\n", (unsigned int)phys_addr);

        uint32_t total_bytes = in_img.total()*in_img.channels();
        uint32_t in_img_total_bytes = (in_img.total()*in_img.channels()+4096) & 0xfffff000; // 4k byte boundary
        printf("in_img_total_bytes = %d\n", in_img_total_bytes);

        pict_buf = (volatile uint8_t *)mmap(NULL, in_img_total_bytes*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
        if (pict_buf == MAP_FAILED){
            fprintf(stderr, "org_mat mmap error\n");
            exit(-1);
        }
        
        // Copy Mat data from in_img to org_mat
        uint8_t *in_img_data = in_img.data;
        for(int i=0; i<total_bytes; i++){
            pict_buf[i] = in_img_data[i];
        }
        
        // Halting Run DMA
        axi_dma_reg[MM2S_CONTROL_REG] = 1; // MM2S DMA Controll Reg. Run
        axi_dma_reg[S2MM_CONTROL_REG] = 1; // S2MM DMA Control Reg. Run
        
        uint32_t median_mat_addr = (uint32_t)phys_addr+in_img_total_bytes;
        uint32_t org_mat_addr = (uint32_t)phys_addr;
        // axi dma settings
        axi_dma_reg[S2MM_DESTINATION_ADDR] = median_mat_addr;
        axi_dma_reg[MM2S_START_ADDR] = org_mat_addr;
        axi_dma_reg[S2MM_LENGTH_REG] = total_bytes;
        axi_dma_reg[MM2S_LENGTH_REG] = total_bytes;
        
        // median filter start
        median_reg[MEDIAN_COL_SIZE] = in_img.cols;
        median_reg[MEDIAN_ROW_SIZE] = in_img.rows;
        median_reg[MEDIAN_FUNCTION_R] = 3;  // median filter for AXI DMA
        median_reg[MEDIAN_CONTROL] = 1;         // ap_start
        
        // DMA completion detection
        uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
        while(mm2s_status_reg != MM2S_IDLE_MASK){
            mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
        }
        
        uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
        while(s2mm_status_reg != S2MM_IDLE_MASK){
            s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
        }
        
        // Copy median image data from median_mat to megian_img
        uint8_t *median_img_data = median_img.data;
        for(int i=0; i<total_bytes; i++){
            median_img_data[i] = pict_buf[in_img_total_bytes+i];
        }
        cv::Mat img;
        resize(median_img, img, cv::Size(), 768.0/median_img.cols, 576.0/median_img.rows);

        vector<YoloRunner::bbox> bboxes = runner.Run(median_img);
        string label_names[] = {"person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"};
        for (auto& box : bboxes) {
            int label = box.label;
            float confidence = box.score;
            float xmin = max(0.0f, box.xmin);
            float ymin = max(0.0f, box.ymin);
            float xmax = min(box.xmin + box.width, (float)img.cols-1.0f);
            float ymax = min(box.ymin + box.height, (float)img.rows-1.0f);
            cout << label_names[box.label] << " " << box.score << " " << xmin << " " << xmax << " " << ymin << " " << ymax << endl;
            rectangle(img, Point(xmin, ymin), Point(xmax, ymax),
                    Scalar(0, 255, 0), 3, 1, 0);
    }
    imwrite("result.jpg", img);
    } else {
    cerr << "unknown mode :" << img_or_video_mode << endl;
    }


    return 0;
}


変更した build.sh を貼っておく。

#
# Copyright 2019 Xilinx Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# 2022/11/23 : Changed demo_yolov4 to median_demo_yolov4. by marsee

result=0 && pkg-config --list-all | grep opencv4 && result=1
if [ $result -eq 1 ]; then
    OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv4)
else
    OPENCV_FLAGS=$(pkg-config --cflags --libs-only-L opencv)
fi

CXX=${CXX:-g++}
$CXX -std=c++17 -O3 -I. -o median_demo_yolov4 median_demo_yolov4.cpp -lglog -lvitis_ai_library-xnnpp -lvitis_ai_library-model_config -lprotobuf -lvitis_ai_library-dpu_task ${OPENCV_FLAGS} -lopencv_core -lopencv_video -lopencv_videoio -lopencv_imgproc -lopencv_imgcodecs -lopencv_highgui

  1. 2022年11月23日 07:08 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する14

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する13”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、コンパイルと prototxtの用意 を行った。今回は、できあがった compiled ディレクトリを KV260 の Petalinux 2022.1 にアップロードした。アプリケーション・ソフトウエアを git clone し、ビルドした。古いモジュールをアンロードして、dpuprj をロードした。アプリケーション・ソフトウエアを実行したところ成功した。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”だ。

できあがった Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/compiled ディレクトリごと FileZIlla で KV260 の Petalinux 2022.1 の ~/kv260_median/dpu ディレクトリに SFTP でアップロードした。
kv260_median_DPU_106_221121.png

なお、~/kv260_median/dpu ディレクトリは”kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する9”で作成済みだ。

ビルド用ツールをインストールした。
sudo dnf install -y cmake g++ g++-symlinks gcc-symlinks binutils pkgconfig git
すでにインストールしてあったモジュールも多いので、pkgconfig と git がインストールされた。
kv260_median_DPU_107_221121.png

アプリケーションを動作させるには /run/media/mmcblk0p1/ 以下にも dpu.xclbin が存在している必要があるそうなのでコピーする。
sudo mkdir -p /run/media/mmcblk0p1/
sudo cp dpu.xclbin /run/media/mmcblk0p1/

kv260_median_DPU_108_221121.png

lp6m さんのアプリケーション・ソフトウエアを git clone して、ビルドする。
git clone https://github.com/lp6m/vitis_ai_dpu_yolo
cd vitis_ai_dpu_yolo
sh build.sh

kv260_median_DPU_109_221121.png

ロードされているモジュールをアンロードして、dpuprj をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp dpuprj


ビルドで作成された demo_yolo4 を実行した。
./demo_yolov4 ../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel dog.jpg image
成功して result.jpg が生成された。
kv260_median_DPU_110_221121.png

~/kv260_median/dpu/vitis_ai_dpu_yolo ディレクトリの中身を示す。
kv260_median_DPU_111_221121.png

result.jpg を示す。
kv260_median_DPU_112_221121.jpg

demo_yolo4 実行時のログを貼っておく。

xilinx-k26-starterkit-20221:~/kv260_median/dpu/vitis_ai_dpu_yolo$ ./demo_yolov4 ../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel dog.jpg image
../compiled/yolov4_leaky_416_tf.prototxt ../compiled/yolov4_leaky_416_tf.xmodel dog.jpgModel Initialize Done
bicycle 0.951898 132.472 550.138 140.873 414.652
car 0.763319 458.46 700.775 71.8596 174.588
truck 0.558414 472.915 687.069 72.4816 169.532
dog 0.988311 133.963 300.746 210 548.74

  1. 2022年11月22日 04:21 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する13

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する12”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、Tensorflowモデルの生成と量子化を行った。今回は、コンパイルと prototxtの用意 を行った。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”だ。

kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/vivado/vpl/prj/prj.gen/sources_1/bd/system/ip/system_DPUCZDX8G_1_0/arch.json を
kv260_median_DPU_100_221120.png

DNN/Vitis-AI/kv260_my arch.json としてコピーした。
kv260_median_DPU_101_221120.png

Vitis-AI /workspace/tf_yolov4_coco_416_416_60.3G_2.5 ディレクトリでコンパイルを行う。
vai_c_tensorflow -f ./quantized/quantize_results_416/quantize_eval_model.pb -a /workspace/kv260_myarch.json -o ./compiled -n yolov4_leaky_416_tf
kv260_median_DPU_102_221120.png

コンパイルが成功して、Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/compiled ディレクトリに yolov4_leaky_416_tf.xmodel が生成された。
kv260_median_DPU_103_221120.png

yolov4_leaky_416_tf.xmodel を netron で見た。
netron は Web ブラウザからテストすることができる。
kv260_median_DPU_105_221120.png

prototxt を用意する
Vitis-AI/yolov4_leaky_416_tf/yolov4_leaky_416_tf.prototxt を Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/compiled ディレクトリにコピーして編集する。
cp ../yolov4_leaky_416_tf/yolov4_leaky_416_tf.prototxt ./compiled/yolov4_leaky_416_tf.prototxt

Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/compiled/yolov4_leaky_416_tf.prototxt を編集した。
kv260_median_DPU_104_221120.png

name: "yolov4"
kernel {
    mean: 0.0
    mean: 0.0
    mean: 0.0
    scale: 0.00390625
    scale: 0.00390625
    scale: 0.00390625
}
model_type : YOLOv3
yolo_v3_param {
    num_classes: 80
    anchorCnt: 3
    layer_name: "109"
    layer_name: "101"
    layer_name: "93"
    conf_threshold: 0.3
    nms_threshold: 0.6
    biases: 10 
    biases: 13
    biases: 16
    biases: 30
    biases: 33
    biases: 23
    biases: 30
    biases: 61
    biases: 62
    biases: 45
    biases: 59
    biases: 119
    biases: 116
    biases: 90
    biases: 156
    biases: 198
    biases: 373
    biases: 326
    test_mAP: false
}


現在の Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/compiled ディレクトリを示す。
kv260_median_DPU_106_221120.png
  1. 2022年11月21日 05:23 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する12

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する11”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、エラーを解消して、続きの環境の設定と量子化および評価に使用するCOCOデータセットをダウンロードして変換した。今回は、Tensorflowモデルの生成と量子化を行う。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”だ。

Tensorflowモデルの生成を行う。
python tools/model_converter/convert.py --yolo4_reorder --fixed_input_shape yolov4-leaky-416.cfg yolov4-leaky-416.weights yolov4-leaky-416.h5
エラーが発生した。

FileNotFoundError: [Errno 2] No such file or directory: 'yolov4-leaky-416.weights'


yolov4-leaky-416.weights が何処にあるか検索したところ、Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/float にあった。
kv260_median_DPU_90_221119.png

次に示すコマンドを実行した。
python tools/model_converter/convert.py --yolo4_reorder --fixed_input_shape ../float/yolov4-leaky-416.cfg ../float/yolov4-leaky-416.weights yolov4-leaky-416.h5
実行が成功して、Keras の yolov4-leaky-416.h5 モデルが生成された。
kv260_median_DPU_91_221119.png

python tools/model_converter/keras_to_tensorflow.py --input_model yolov4-leaky-416.h5 --output_model yolov4-leaky-416.pb
実行したところ、エラーが発生した。

AttributeError: 'str' object has no attribute 'decode'


kv260_median_DPU_92_221119.png

このエラーは”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”に対処方法が記載されていたので、対処を行った。
pip install install h5py==2.10.0
kv260_median_DPU_93_221119.png

再度、
python tools/model_converter/keras_to_tensorflow.py --input_model yolov4-leaky-416.h5 --output_model yolov4-leaky-416.pb
成功した。
kv260_median_DPU_94_221119.png

yolov4-leaky-416.pb が生成された。
kv260_median_DPU_95_221119.png

量子化を行う。
conda activate vitis-ai-tensorflow
cd quantize
bash quantize_416.sh

エラーが発生した。

ValueError: ('Fail to import input_fn, error: ', ModuleNotFoundError("No module named 'imgaug'",))


kv260_median_DPU_96_221119.png

imgaug をインストールする必要があるようだ。
pip install imgaug
kv260_median_DPU_97_221119.png

もう一度、
bash quantize_416.sh
を実行した。
11時間44分掛かって終了した。
kv260_median_DPU_98_221120.png

Vitis-AI/tf_yolov4_coco_416_416_60.3G_2.5/quantized/quantize_results_416/quantize_eval_model.pb が生成された。
kv260_median_DPU_99_221120.png
  1. 2022年11月20日 04:04 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する11

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する10”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、tf_yolov4_coco_416_416_60.3G_2.5.zip と yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz を wget して、展開した。Vitis-AI の docker を起動して、conda を実行したところで、エラーになってしまった。今回は、エラーを解消して、続きの環境の設定と量子化および評価に使用するCOCOデータセットをダウンロードして変換した。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”だ。

Anaconda備忘録”によると conda のコンフィグ・ファイルの .condarc があるようなのだ。
conda config --show-sources
で .condarc を見た。ログを示す。

Vitis-AI /workspace/tf_yolov4_coco_416_416_60.3G_2.5 > conda config --show-sources
==> /home/vitis-ai-user/.condarc <==
channels:
  - defaults
  - http://artifactory/artifactory/vitis-ai-conda-release


下の URL が邪魔なようなので、vi を起動して削除する。
vi /home/vitis-ai-user/.condarc
kv260_median_DPU_76_221118.png

URL を削除した。
kv260_median_DPU_77_221118.png

vi を終了した。
kv260_median_DPU_78_221118.png

もう一度
conda create -n yolov4-tf1 python=3.6
したら成功した。
kv260_median_DPU_79_221118.png

source activate yolov4-tf1
kv260_median_DPU_79_221119.png

pip install cython
kv260_median_DPU_80_221119.png

pip install -r code/requirements.txt
kv260_median_DPU_81_221119.png

code ディレクトリに行く。
cd code
bash download_data.sh

kv260_median_DPU_82_221119.png

bash convert_data.sh
エラーが発生した。

python: can't open file 'code/tools/dataset_converter/coco_annotation_val.py': [Errno 2] No such file or directory
Save result to data


kv260_median_DPU_83_221119.png

convert_data.sh を見たところ、

CODEBASE_DIR=code

がおかしいようだった。
kv260_median_DPU_85_221119.png

code/tools/dataset_converter/coco_annotation_val.py だが、すでに code ディレクトリにいるので、

CODEBASE_DIR=.

で良いのではないだろうか?
kv260_median_DPU_86_221119.png

convert_data.sh を修正した。
kv260_median_DPU_87_221119.png

もう一度、
bash convert_data.sh
今度は成功だ。
kv260_median_DPU_88_221119.png

conda create -n yolov4-tf1 python=3.6 実行時のログを示す。

Vitis-AI /workspace/tf_yolov4_coco_416_416_60.3G_2.5 > conda create -n yolov4-tf1 python=3.6
Collecting package metadata (current_repodata.json): done
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /opt/vitis_ai/conda/envs/yolov4-tf1

  added / updated specs:
    - python=3.6


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _libgcc_mutex-0.1          |             main           3 KB
    _openmp_mutex-5.1          |            1_gnu          21 KB
    ca-certificates-2022.10.11 |       h06a4308_0         124 KB
    certifi-2021.5.30          |   py36h06a4308_0         139 KB
    ld_impl_linux-64-2.38      |       h1181459_1         654 KB
    libffi-3.3                 |       he6710b0_2          50 KB
    libgcc-ng-11.2.0           |       h1234567_1         5.3 MB
    libgomp-11.2.0             |       h1234567_1         474 KB
    libstdcxx-ng-11.2.0        |       h1234567_1         4.7 MB
    ncurses-6.3                |       h5eee18b_3         781 KB
    openssl-1.1.1s             |       h7f8727e_0         3.6 MB
    pip-21.2.2                 |   py36h06a4308_0         1.8 MB
    python-3.6.13              |       h12debd9_1        32.5 MB
    readline-8.2               |       h5eee18b_0         357 KB
    setuptools-58.0.4          |   py36h06a4308_0         788 KB
    sqlite-3.39.3              |       h5082296_0         1.1 MB
    tk-8.6.12                  |       h1ccaba5_0         3.0 MB
    wheel-0.37.1               |     pyhd3eb1b0_0          33 KB
    xz-5.2.6                   |       h5eee18b_0         394 KB
    zlib-1.2.13                |       h5eee18b_0         103 KB
    ------------------------------------------------------------
                                           Total:        55.9 MB

The following NEW packages will be INSTALLED:

  _libgcc_mutex      pkgs/main/linux-64::_libgcc_mutex-0.1-main
  _openmp_mutex      pkgs/main/linux-64::_openmp_mutex-5.1-1_gnu
  ca-certificates    pkgs/main/linux-64::ca-certificates-2022.10.11-h06a4308_0
  certifi            pkgs/main/linux-64::certifi-2021.5.30-py36h06a4308_0
  ld_impl_linux-64   pkgs/main/linux-64::ld_impl_linux-64-2.38-h1181459_1
  libffi             pkgs/main/linux-64::libffi-3.3-he6710b0_2
  libgcc-ng          pkgs/main/linux-64::libgcc-ng-11.2.0-h1234567_1
  libgomp            pkgs/main/linux-64::libgomp-11.2.0-h1234567_1
  libstdcxx-ng       pkgs/main/linux-64::libstdcxx-ng-11.2.0-h1234567_1
  ncurses            pkgs/main/linux-64::ncurses-6.3-h5eee18b_3
  openssl            pkgs/main/linux-64::openssl-1.1.1s-h7f8727e_0
  pip                pkgs/main/linux-64::pip-21.2.2-py36h06a4308_0
  python             pkgs/main/linux-64::python-3.6.13-h12debd9_1
  readline           pkgs/main/linux-64::readline-8.2-h5eee18b_0
  setuptools         pkgs/main/linux-64::setuptools-58.0.4-py36h06a4308_0
  sqlite             pkgs/main/linux-64::sqlite-3.39.3-h5082296_0
  tk                 pkgs/main/linux-64::tk-8.6.12-h1ccaba5_0
  wheel              pkgs/main/noarch::wheel-0.37.1-pyhd3eb1b0_0
  xz                 pkgs/main/linux-64::xz-5.2.6-h5eee18b_0
  zlib               pkgs/main/linux-64::zlib-1.2.13-h5eee18b_0


Proceed ([y]/n)? y


Downloading and Extracting Packages
wheel-0.37.1         | 33 KB     | ##################################### | 100% 
setuptools-58.0.4    | 788 KB    | ##################################### | 100% 
libgcc-ng-11.2.0     | 5.3 MB    | ##################################### | 100% 
pip-21.2.2           | 1.8 MB    | ##################################### | 100% 
sqlite-3.39.3        | 1.1 MB    | ##################################### | 100% 
ncurses-6.3          | 781 KB    | ##################################### | 100% 
libffi-3.3           | 50 KB     | ##################################### | 100% 
zlib-1.2.13          | 103 KB    | ##################################### | 100% 
openssl-1.1.1s       | 3.6 MB    | ##################################### | 100% 
_openmp_mutex-5.1    | 21 KB     | ##################################### | 100% 
readline-8.2         | 357 KB    | ##################################### | 100% 
python-3.6.13        | 32.5 MB   | ##################################### | 100% 
_libgcc_mutex-0.1    | 3 KB      | ##################################### | 100% 
ca-certificates-2022 | 124 KB    | ##################################### | 100% 
ld_impl_linux-64-2.3 | 654 KB    | ##################################### | 100% 
libgomp-11.2.0       | 474 KB    | ##################################### | 100% 
libstdcxx-ng-11.2.0  | 4.7 MB    | ##################################### | 100% 
tk-8.6.12            | 3.0 MB    | ##################################### | 100% 
certifi-2021.5.30    | 139 KB    | ##################################### | 100% 
xz-5.2.6             | 394 KB    | ##################################### | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#
#     $ conda activate yolov4-tf1
#
# To deactivate an active environment, use
#
#     $ conda deactivate


pip install -r code/requirements.txt 実行時のログを示す。

(yolov4-tf1) Vitis-AI /workspace/tf_yolov4_coco_416_416_60.3G_2.5 > pip install -r code/requirements.txt
Collecting numpy
  Downloading numpy-1.19.5-cp36-cp36m-manylinux2010_x86_64.whl (14.8 MB)
     |████████████████████████████████| 14.8 MB 12.1 MB/s            
Requirement already satisfied: setuptools in /home/vitis-ai-user/.local/lib/python3.6/site-packages (from -r code/requirements.txt (line 2)) (59.6.0)
Collecting scipy
  Downloading scipy-1.5.4-cp36-cp36m-manylinux1_x86_64.whl (25.9 MB)
     |████████████████████████████████| 25.9 MB 12.1 MB/s            
Collecting scikit-learn==0.20.3
  Downloading scikit_learn-0.20.3-cp36-cp36m-manylinux1_x86_64.whl (5.4 MB)
     |████████████████████████████████| 5.4 MB 11.0 MB/s            
Collecting opencv-python==4.2.0.32
  Downloading opencv_python-4.2.0.32-cp36-cp36m-manylinux1_x86_64.whl (28.2 MB)
     |████████████████████████████████| 28.2 MB 12.1 MB/s            
Collecting opencv-contrib-python==4.2.0.32
  Downloading opencv_contrib_python-4.2.0.32-cp36-cp36m-manylinux1_x86_64.whl (34.2 MB)
     |████████████████████████████████| 34.2 MB 51 kB/s              
Collecting tensorflow-gpu==1.15.2
  Downloading tensorflow_gpu-1.15.2-cp36-cp36m-manylinux2010_x86_64.whl (411.0 MB)
     |████████████████████████████████| 411.0 MB 18 kB/s              
Collecting matplotlib
  Downloading matplotlib-3.3.4-cp36-cp36m-manylinux1_x86_64.whl (11.5 MB)
     |████████████████████████████████| 11.5 MB 601 kB/s             
Collecting tqdm
  Downloading tqdm-4.64.1-py2.py3-none-any.whl (78 kB)
     |████████████████████████████████| 78 kB 955 kB/s             
Collecting pillow
  Downloading Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.1 MB)
     |████████████████████████████████| 3.1 MB 14.0 MB/s            
Requirement already satisfied: Cython in /opt/vitis_ai/conda/envs/yolov4-tf1/lib/python3.6/site-packages (from -r code/requirements.txt (line 15)) (0.29.32)
Collecting pycocotools
  Downloading pycocotools-2.0.6.tar.gz (24 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting sympy
  Downloading sympy-1.9-py3-none-any.whl (6.2 MB)
     |████████████████████████████████| 6.2 MB 12.4 MB/s            
Collecting imgaug
  Downloading imgaug-0.4.0-py2.py3-none-any.whl (948 kB)
     |████████████████████████████████| 948 kB 11.3 MB/s            
Collecting imagecorruptions
  Downloading imagecorruptions-1.1.2-py3-none-any.whl (2.1 MB)
     |████████████████████████████████| 2.1 MB 11.9 MB/s            
Collecting bokeh
  Downloading bokeh-2.3.3.tar.gz (10.7 MB)
     |████████████████████████████████| 10.7 MB 20 kB/s              
  Preparing metadata (setup.py) ... done
Collecting tidecv
  Downloading tidecv-1.0.1-py3-none-any.whl (25 kB)
Collecting wrapt>=1.11.1
  Downloading wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (74 kB)
     |████████████████████████████████| 74 kB 604 kB/s             
Collecting tensorflow-estimator==1.15.1
  Downloading tensorflow_estimator-1.15.1-py2.py3-none-any.whl (503 kB)
     |████████████████████████████████| 503 kB 11.6 MB/s            
Collecting termcolor>=1.1.0
  Downloading termcolor-1.1.0.tar.gz (3.9 kB)
  Preparing metadata (setup.py) ... done
Requirement already satisfied: wheel>=0.26 in /home/vitis-ai-user/.local/lib/python3.6/site-packages (from tensorflow-gpu==1.15.2->-r code/requirements.txt (line 7)) (0.37.1)
Collecting opt-einsum>=2.3.2
  Downloading opt_einsum-3.3.0-py3-none-any.whl (65 kB)
     |████████████████████████████████| 65 kB 481 kB/s             
Collecting gast==0.2.2
  Downloading gast-0.2.2.tar.gz (10 kB)
  Preparing metadata (setup.py) ... done
Collecting google-pasta>=0.1.6
  Downloading google_pasta-0.2.0-py3-none-any.whl (57 kB)
     |████████████████████████████████| 57 kB 899 kB/s             
Collecting astor>=0.6.0
  Downloading astor-0.8.1-py2.py3-none-any.whl (27 kB)
Collecting absl-py>=0.7.0
  Downloading absl_py-1.3.0-py3-none-any.whl (124 kB)
     |████████████████████████████████| 124 kB 11.5 MB/s            
Collecting protobuf>=3.6.1
  Downloading protobuf-3.19.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB)
     |████████████████████████████████| 1.1 MB 11.9 MB/s            
Collecting grpcio>=1.8.6
  Downloading grpcio-1.48.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (4.6 MB)
     |████████████████████████████████| 4.6 MB 11.2 MB/s            
Collecting keras-applications>=1.0.8
  Downloading Keras_Applications-1.0.8-py3-none-any.whl (50 kB)
     |████████████████████████████████| 50 kB 992 kB/s             
Collecting keras-preprocessing>=1.0.5
  Downloading Keras_Preprocessing-1.1.2-py2.py3-none-any.whl (42 kB)
     |████████████████████████████████| 42 kB 166 kB/s             
Collecting tensorboard<1.16.0,>=1.15.0
  Downloading tensorboard-1.15.0-py3-none-any.whl (3.8 MB)
     |████████████████████████████████| 3.8 MB 12.1 MB/s            
Collecting six>=1.10.0
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3
  Downloading pyparsing-3.0.9-py3-none-any.whl (98 kB)
     |████████████████████████████████| 98 kB 1.4 MB/s             
Collecting kiwisolver>=1.0.1
  Downloading kiwisolver-1.3.1-cp36-cp36m-manylinux1_x86_64.whl (1.1 MB)
     |████████████████████████████████| 1.1 MB 11.9 MB/s            
Collecting cycler>=0.10
  Downloading cycler-0.11.0-py3-none-any.whl (6.4 kB)
Collecting python-dateutil>=2.1
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 11.5 MB/s            
Collecting importlib-resources
  Downloading importlib_resources-5.4.0-py3-none-any.whl (28 kB)
Collecting mpmath>=0.19
  Downloading mpmath-1.2.1-py3-none-any.whl (532 kB)
     |████████████████████████████████| 532 kB 11.4 MB/s            
Collecting Shapely
  Downloading Shapely-1.8.5.post1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (2.0 MB)
     |████████████████████████████████| 2.0 MB 12.7 MB/s            
Collecting imageio
  Downloading imageio-2.15.0-py3-none-any.whl (3.3 MB)
     |████████████████████████████████| 3.3 MB 11.4 MB/s            
Collecting scikit-image>=0.14.2
  Downloading scikit_image-0.17.2-cp36-cp36m-manylinux1_x86_64.whl (12.4 MB)
     |████████████████████████████████| 12.4 MB 12.1 MB/s            
Collecting PyYAML>=3.10
  Downloading PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (603 kB)
     |████████████████████████████████| 603 kB 11.4 MB/s            
Collecting Jinja2>=2.9
  Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
     |████████████████████████████████| 133 kB 11.4 MB/s            
Collecting packaging>=16.8
  Downloading packaging-21.3-py3-none-any.whl (40 kB)
     |████████████████████████████████| 40 kB 1.2 MB/s             
Collecting tornado>=5.1
  Downloading tornado-6.1-cp36-cp36m-manylinux2010_x86_64.whl (427 kB)
     |████████████████████████████████| 427 kB 11.5 MB/s            
Collecting typing_extensions>=3.7.4
  Downloading typing_extensions-4.1.1-py3-none-any.whl (26 kB)
Collecting seaborn
  Downloading seaborn-0.11.2-py3-none-any.whl (292 kB)
     |████████████████████████████████| 292 kB 13.5 MB/s            
Collecting pandas
  Downloading pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl (9.5 MB)
     |████████████████████████████████| 9.5 MB 12.8 MB/s            
Collecting appdirs
  Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (30 kB)
Collecting h5py
  Downloading h5py-3.1.0-cp36-cp36m-manylinux1_x86_64.whl (4.0 MB)
     |████████████████████████████████| 4.0 MB 13.2 MB/s            
Collecting tifffile>=2019.7.26
  Downloading tifffile-2020.9.3-py3-none-any.whl (148 kB)
     |████████████████████████████████| 148 kB 12.8 MB/s            
Collecting PyWavelets>=1.1.1
  Downloading PyWavelets-1.1.1-cp36-cp36m-manylinux1_x86_64.whl (4.4 MB)
     |████████████████████████████████| 4.4 MB 12.3 MB/s            
Collecting networkx>=2.0
  Downloading networkx-2.5.1-py3-none-any.whl (1.6 MB)
     |████████████████████████████████| 1.6 MB 11.6 MB/s            
Collecting markdown>=2.6.8
  Downloading Markdown-3.3.7-py3-none-any.whl (97 kB)
     |████████████████████████████████| 97 kB 1.2 MB/s             
Collecting werkzeug>=0.11.15
  Downloading Werkzeug-2.0.3-py3-none-any.whl (289 kB)
     |████████████████████████████████| 289 kB 11.5 MB/s            
Collecting zipp>=3.1.0
  Downloading zipp-3.6.0-py3-none-any.whl (5.3 kB)
Collecting pytz>=2017.2
  Downloading pytz-2022.6-py2.py3-none-any.whl (498 kB)
     |████████████████████████████████| 498 kB 11.9 MB/s            
Collecting importlib-metadata>=4.4
  Downloading importlib_metadata-4.8.3-py3-none-any.whl (17 kB)
Collecting decorator<5,>=4.3
  Downloading decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Collecting dataclasses
  Downloading dataclasses-0.8-py3-none-any.whl (19 kB)
Collecting cached-property
  Downloading cached_property-1.5.2-py2.py3-none-any.whl (7.6 kB)
Building wheels for collected packages: gast, pycocotools, bokeh, termcolor
  Building wheel for gast (setup.py) ... done
  Created wheel for gast: filename=gast-0.2.2-py3-none-any.whl size=7554 sha256=efe58f6f440e04508f08fdaa0b6a65f31c2d4493b204538c3858d75434839b8c
  Stored in directory: /home/vitis-ai-user/.cache/pip/wheels/19/a7/b9/0740c7a3a7d1d348f04823339274b90de25fbcd217b2ee1fbe
  Building wheel for pycocotools (pyproject.toml) ... done
  Created wheel for pycocotools: filename=pycocotools-2.0.6-cp36-cp36m-linux_x86_64.whl size=375293 sha256=89a5d0c85b0b092a120e50a322b036f9beae0383d20b5284da97b9de5c0408ec
  Stored in directory: /home/vitis-ai-user/.cache/pip/wheels/39/5f/a6/d19eb746e1b7525795fa8910576ddc6108d0c9cf343e4155e8
  Building wheel for bokeh (setup.py) ... done
  Created wheel for bokeh: filename=bokeh-2.3.3-py3-none-any.whl size=11342785 sha256=727712d0432a8aa0300b84b907a5070c834ad1b127cda50be0c8fa12a94b6aa8
  Stored in directory: /home/vitis-ai-user/.cache/pip/wheels/8b/59/97/257265b741bab184e0cc8f5676309cb1fe6fbda22011bbb3ff
  Building wheel for termcolor (setup.py) ... done
  Created wheel for termcolor: filename=termcolor-1.1.0-py3-none-any.whl size=4848 sha256=552a51bb0b13ae81536e412dcd2412c4c54d2da002215f357acfcf6e67e08850
  Stored in directory: /home/vitis-ai-user/.cache/pip/wheels/93/2a/eb/e58dbcbc963549ee4f065ff80a59f274cc7210b6eab962acdc
Successfully built gast pycocotools bokeh termcolor
Installing collected packages: zipp, typing-extensions, six, pytz, python-dateutil, pyparsing, pillow, numpy, kiwisolver, importlib-metadata, decorator, dataclasses, cycler, cached-property, werkzeug, tifffile, scipy, PyWavelets, protobuf, pandas, networkx, matplotlib, MarkupSafe, markdown, imageio, h5py, grpcio, absl-py, wrapt, tornado, termcolor, tensorflow-estimator, tensorboard, Shapely, seaborn, scikit-image, PyYAML, pycocotools, packaging, opt-einsum, opencv-python, mpmath, keras-preprocessing, keras-applications, Jinja2, importlib-resources, google-pasta, gast, astor, appdirs, tqdm, tidecv, tensorflow-gpu, sympy, scikit-learn, opencv-contrib-python, imgaug, imagecorruptions, bokeh
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 PyWavelets-1.1.1 PyYAML-6.0 Shapely-1.8.5.post1 absl-py-1.3.0 appdirs-1.4.4 astor-0.8.1 bokeh-2.3.3 cached-property-1.5.2 cycler-0.11.0 dataclasses-0.8 decorator-4.4.2 gast-0.2.2 google-pasta-0.2.0 grpcio-1.48.2 h5py-3.1.0 imagecorruptions-1.1.2 imageio-2.15.0 imgaug-0.4.0 importlib-metadata-4.8.3 importlib-resources-5.4.0 keras-applications-1.0.8 keras-preprocessing-1.1.2 kiwisolver-1.3.1 markdown-3.3.7 matplotlib-3.3.4 mpmath-1.2.1 networkx-2.5.1 numpy-1.19.5 opencv-contrib-python-4.2.0.32 opencv-python-4.2.0.32 opt-einsum-3.3.0 packaging-21.3 pandas-1.1.5 pillow-8.4.0 protobuf-3.19.6 pycocotools-2.0.6 pyparsing-3.0.9 python-dateutil-2.8.2 pytz-2022.6 scikit-image-0.17.2 scikit-learn-0.20.3 scipy-1.5.4 seaborn-0.11.2 six-1.16.0 sympy-1.9 tensorboard-1.15.0 tensorflow-estimator-1.15.1 tensorflow-gpu-1.15.2 termcolor-1.1.0 tidecv-1.0.1 tifffile-2020.9.3 tornado-6.1 tqdm-4.64.1 typing-extensions-4.1.1 werkzeug-2.0.3 wrapt-1.14.1 zipp-3.6.0

  1. 2022年11月19日 04:43 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する10

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する9”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、dpu.dtbo ファイルを用意して、dpu.dtbo、dpu.xclbin、shell.json ファイルを KV260 の Petalinux 2022.1 に SFTP でアップロードした。KV260 の Petalinux でそれらのファイルを /lib/firmware/xilinx/dpuprj にコピーして xmutil でロードすることができた。今回は、”KV260向けにVitisプラットフォームを作成してDPUを動かす その2 (Vitis 2022.1 + Vitis-AI v2.5)”を参考に進めていく。tf_yolov4_coco_416_416_60.3G_2.5.zip と yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz を wget して、展開した。Vitis-AI の docker を起動して、conda を実行したところで、エラーになってしまった。

Vitis-AI に移動して、tf_yolov4_coco_416_416_60.3G_2.5.zip と yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz を wget して、展開する。
cd /media/masaaki/Ubuntu_Disk/DNN/Vitis-AI/
wget https://www.xilinx.com/bin/public/openDownload?filename=tf_yolov4_coco_416_416_60.3G_2.5.zip -O tf_yolov4_coco_416_416_60.3G_2.5.zip

kv260_median_DPU_63_221116.png

unzip -q tf_yolov4_coco_416_416_60.3G_2.5.zip
kv260_median_DPU_64_221116.png

wget https://www.xilinx.com/bin/public/openDownload?filename=yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz -O yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz
kv260_median_DPU_65_221116.png

tar xvf yolov4_leaky_416_tf-zcu102_zcu104_kv260-r2.5.0.tar.gz
kv260_median_DPU_66_221116.png

KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”の手順の中で、”./docker_build_gpu.sh”の実行を忘れていたが、
./docker_run.sh xilinx/vitis-ai-gpu:2.5
で起動したところエラーになったので、
./docker_run.sh xilinx/vitis-ai-cpu:2.5
で docker をビルドして、Vitis-AI が起動した。
kv260_median_DPU_67_221117.png

”環境とデータセットの準備”の conda を実行するところでエラーが発生した。
kv260_median_DPU_68_221118.png

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <http://artifactory/artifactory/vitis-ai-conda-release/linux-64/current_repodata.json>


ということで、URL がおかしくなっている。

  1. 2022年11月18日 04:43 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する9

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する8”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、DPU が挿入された Vivado プロジェクトのブロック・デザインを確認し、arch.json を kv260_myarch.json として dpuprj_system_hw_link ディレクトリにコピーした。今回は、dpu.dtbo ファイルを用意して、dpu.dtbo、dpu.xclbin、shell.json ファイルを KV260 の Petalinux 2022.1 に SFTP でアップロードした。KV260 の Petalinux でそれらのファイルを /lib/firmware/xilinx/dpuprj にコピーして xmutil でロードすることができた。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加している。

dpu.dtbo ファイルを用意する
pl.dtsi ファイルを編集して、pl.dtbo ファイルを作成する。
pl.dtsi ファイルは kv260_median_platform/device-tree-xlnx ディレクトリにある。

pl.dtsi を開いて 16 行目の一部をdpu.bin に変更する。
kv260_median_DPU_55_221115.png

pl.dtsi をコンパイルして、pl.dtbo を作成し、名前を dpu.dtbo に変更した。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/device-tree-xlnx
dtc -@ -O dtb -o pl.dtbo pl.dtsi
mv pl.dtbo dpu.dtbo

kv260_median_DPU_56_221115.png

shell.json はすでに kv260_median_platform/kv260_median_pkg/pfm ディレクトリに作成済みだ。
kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる14”を参照

以下のファイルを FileZilla で KV260 の Petalinux 2022.1 に作成した ~/kv260_median/dpu ディレクトリに SFTP でアップロードした。
cd ~/kv260_median
mkdir dpu
cd dpu

kv260_median_platform/device-tree-xlnx/dpu.dtbo
kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin
kv260_median_platform/kv260_median_pkg/pfm/shell.json


kv260_median_DPU_57_221115.png

ここからは KV260 の Petalinux 2022.1 上での作業となる。
/lib/firmware/xilinx/dpuprj ディレクトリを作成して、ファイルをコピーする。
dpu.xclbin は dpu.bin にリネームした。xclbin が bin としても使えるのは知らなかった。。。
sudo mkdir /lib/firmware/xilinx/dpuprj
sudo cp dpu.dtbo shell.json /lib/firmware/xilinx/dpuprj/
sudo cp dpu.xclbin /lib/firmware/xilinx/dpuprj/dpu.bin
ls -l /lib/firmware/xilinx/dpuprj/

kv260_median_DPU_58_221115.png

xmutil で現在ロードされているモジュールをアンロードして、dpuprj をロードできた。
sudo xmutil unloadapp
sudo xmutil loadapp dpuprj

kv260_median_DPU_59_221115.png
  1. 2022年11月16日 04:59 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する8

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する7”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、dpuprj アプリケーション・プロジェクトを作成し、dpu_conf.vhを修正した。更に、dpuprj_system_hw_link/Hardware/dpu-link.cfg を修正して、make を行った。今回は、DPU が挿入された Vivado プロジェクトのブロック・デザインを確認し、arch.json を kv260_myarch.json として dpuprj_system_hw_link ディレクトリにコピーした。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加している。

kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/vivado/vpl/prj ディレクトリに DPU 入りの Vivado 2022.1 プロジェクトがあった。
kv260_median_DPU_51_221114.png

Vivado を起動して、prj プロジェクトを読み込んで、ブロック・デザインを表示した。
kv260_median_DPU_52_221114.png

dpu の部分を拡大した。
DPUCXDX8G_1 が実装されている。
kv260_median_DPU_54_221114.png

Address Editor 画面を示す。
kv260_median_DPU_53_221114.png

DPUのコンフィグレーション情報を表すJSONファイルが kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/vivado/vpl/prj/prj.gen/sources_1/bd/system/ip/system_DPUCZDX8G_1_0/arch.json ということのようだ。
kv260_median_DPU_60_221115.png

arch.json の内容を示す。1行だけだった。
kv260_median_DPU_62_221115.png

arch.json を kv260_myarch.json と名前を変えて kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link ディレクトリにコピーした。
kv260_median_DPU_61_221115.png
  1. 2022年11月15日 05:24 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する7

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する6”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、ストパソコン上で、sysroot を生成し、DPUCZDX8G をダウンロードし、Vitis 2022.1 の kv260_median_pkg ワークスペースでライブラリのリポジトリに DPUCZDX8G を追加した。今回は、dpuprj アプリケーション・プロジェクトを作成し、dpu_conf.vhを修正した。更に、dpuprj_system_hw_link/Hardware/dpu-link.cfg を修正して、make を行った。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加している。

Vitis で dpuprj アプリケーション・プロジェクトを作成した。
File メニューから New -> Application Project... を選択した。

Platform 画面
kv260_median プラットフォームを選択する。

Application Project Detail 画面
Application project name に dpuprj と入力する。
kv260_median_DPU_39_221114.png

Domain 画面
sysroot path: に kv260_median_platform/kv260_median_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
kv260_median_DPU_40_221114.png

Templates 画面
DPU Kernel(RTL Kernel) を選択した。
Finish ボタンをクリックした。
kv260_median_DPU_41_221114.png

dpuprj アプリケーション・プロジェクトが生成された。
kv260_median_DPU_42_221114.png

dpuprj_system -> dpuprj_kernels -> src -> prj -> Vitis -> dpu_conf.vh を編集した。
kv260_median_DPU_43_221114.png

42 行目を

`define B3136 //`define B4096

に変更した。なお、コメントはデフォルト設定値を示す。
53 行目を

`define URAM_ENABLE //`define URAM_DISABLE

に変更した。
75 行目を

`define DRAM_ENABLE //`define DRAM_DISABLE

に変更した。
97 行目を

`define RAM_USAGE_HIGH // `define RAM_USAGE_LOW

に変更した。

Explorer から dpuprj_system_hw_link -> Hardware -> dpuprj_system_hw_link.prj ファイルを開いた。
Active build configuration を Hardware に変更した。
Hardware Functions の sfm_xrt_top を右クリックし右クリックメニューから Remove を選択して削除する。
DPUCZDX8Gの個数を2個から1個に変更するのを忘れてしまった。
kv260_median_DPU_44_221114.png

Explorer から dpuprj_system をクリックし、トンカチ・ボタンをクリックして、ビルドを行う。
kv260_median_DPU_45_221114.png

ビルドはエラーだった。dpuprj_kernels はビルドを通っているので、これで問題ないそうだ。

dpuprj_system_hw_link/Hardware/dpu-link.cfg を修正する。
元のファイルを示す。
kv260_median_DPU_47_221114.png

これを修正した。
kv260_median プラットフォームは、クロックは 100 MHz、 200 MHz、400 MHz の3系統で、id は 0, 1, 2 だ。
更に HPC0 は axi_dma 用に使用しているので、代わりに HPC1 を指定した。
kv260_median_DPU_48_221114.png
修正箇所

[clock]
#100, 200, 400
id=1:DPUCZDX8G_1.aclk
id=2:DPUCZDX8G_1.ap_clk_2

[connectivity]
nk=DPUCZDX8G:1:DPUCZDX8G_1
sp=DPUCZDX8G_1.M_AXI_GP0:HPC1
sp=DPUCZDX8G_1.M_AXI_HP0:HP0
sp=DPUCZDX8G_1.M_AXI_HP2:HP1



make を行う。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware
make

kv260_median_DPU_49_221114.png

kv260_median_DPU_50_221114.png

make のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware$ make
/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/bin/v++ --target hw --link --config dpu-link.cfg -o"dpu.xclbin" ../../dpuprj_kernels/Hardware/DPUCZDX8G.xo
Option Map File Used: '/media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/data/vitis/vpp/optMap.xml'

****** v++ v2022.1 (64-bit)
  **** SW Build 3524075 on 2022-04-13-17:42:45
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.

INFO: [v++ 60-1306] Additional information associated with this v++ link can be found at:
    Reports: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link
    Log files: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/logs/link
Running Dispatch Server on port: 44845
INFO: [v++ 60-1548] Creating build summary session with primary output /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin.link_summary, at Mon Nov 14 04:53:04 2022
INFO: [v++ 60-1316] Initiating connection to rulecheck server, at Mon Nov 14 04:53:04 2022
INFO: [v++ 60-1315] Creating rulecheck session with output '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link/link_guidance.html', at Mon Nov 14 04:53:06 2022
INFO: [v++ 60-895]   Target platform: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/kv260_median/export/kv260_median/kv260_median.xpfm
INFO: [v++ 60-1578]   This platform contains Xilinx Shell Archive '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/kv260_median/export/kv260_median/hw/kv260_median_platform.xsa'
INFO: [v++ 60-629] Linking for hardware target
INFO: [v++ 60-423]   Target device: kv260_median
INFO: [v++ 60-1332] Run 'run_link' status: Not started
INFO: [v++ 60-1443] [04:53:07] Run run_link: Step system_link: Started
INFO: [v++ 60-1453] Command Line: system_link --xo /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_kernels/Hardware/DPUCZDX8G.xo -keep --config /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/syslinkConfig.ini --xpfm /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/kv260_median/export/kv260_median/kv260_median.xpfm --target hw --output_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int --temp_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [SYSTEM_LINK 60-1316] Initiating connection to rulecheck server, at Mon Nov 14 04:53:08 2022
INFO: [SYSTEM_LINK 82-70] Extracting xo v3 file /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_kernels/Hardware/DPUCZDX8G.xo
INFO: [SYSTEM_LINK 82-53] Creating IP database /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml
INFO: [SYSTEM_LINK 82-38] [04:53:08] build_xd_ip_db started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/bin/build_xd_ip_db -ip_search 0  -sds-pf /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/kv260_median_platform.hpfm -clkid 1 -ip /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/iprepo/xilinx_com_RTLKernel_DPUCZDX8G_1_0,DPUCZDX8G -o /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml
INFO: [SYSTEM_LINK 82-37] [04:53:12] build_xd_ip_db finished successfully
Time (s): cpu = 00:00:07 ; elapsed = 00:00:04 . Memory (MB): peak = 2279.844 ; gain = 610.293 ; free physical = 2173 ; free virtual = 37164
INFO: [SYSTEM_LINK 82-51] Create system connectivity graph
INFO: [SYSTEM_LINK 82-102] Applying explicit connections to the system connectivity graph: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/cfgraph/cfgen_cfgraph.xml
INFO: [SYSTEM_LINK 82-38] [04:53:12] cfgen started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/bin/cfgen  -nk DPUCZDX8G:1:DPUCZDX8G_1 -sp DPUCZDX8G_1.M_AXI_GP0:HPC1 -sp DPUCZDX8G_1.M_AXI_HP0:HP0 -sp DPUCZDX8G_1.M_AXI_HP2:HP1 -clock.id 1:DPUCZDX8G_1.aclk -clock.id 2:DPUCZDX8G_1.ap_clk_2 -dmclkid 1 -r /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml -o /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/cfgraph/cfgen_cfgraph.xml
INFO: [CFGEN 83-0] Kernel Specs: 
INFO: [CFGEN 83-0]   kernel: DPUCZDX8G, num: 1  {DPUCZDX8G_1}
INFO: [CFGEN 83-0] Port Specs: 
INFO: [CFGEN 83-0]   kernel: DPUCZDX8G_1, k_port: M_AXI_GP0, sptag: HPC1
INFO: [CFGEN 83-0]   kernel: DPUCZDX8G_1, k_port: M_AXI_HP0, sptag: HP0
INFO: [CFGEN 83-0]   kernel: DPUCZDX8G_1, k_port: M_AXI_HP2, sptag: HP1
INFO: [SYSTEM_LINK 82-37] [04:53:14] cfgen finished successfully
Time (s): cpu = 00:00:01 ; elapsed = 00:00:01 . Memory (MB): peak = 2279.844 ; gain = 0.000 ; free physical = 2172 ; free virtual = 37162
INFO: [SYSTEM_LINK 82-52] Create top-level block diagram
INFO: [SYSTEM_LINK 82-38] [04:53:14] cf2bd started: /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/bin/cf2bd  --linux --trace_buffer 1024 --input_file /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/cfgraph/cfgen_cfgraph.xml --ip_db /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml --cf_name dr --working_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.xsd --temp_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link --output_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int
INFO: [CF2BD 82-31] Launching cf2xd: cf2xd -linux -trace-buffer 1024 -i /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/cfgraph/cfgen_cfgraph.xml -r /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.cdb/xd_ip_db.xml -o dr.xml
INFO: [CF2BD 82-28] cf2xd finished successfully
INFO: [CF2BD 82-31] Launching cf_xsd: cf_xsd -disable-address-gen -dn dr -dp /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/sys_link/_sysl/.xsd
INFO: [CF2BD 82-28] cf_xsd finished successfully
INFO: [SYSTEM_LINK 82-37] [04:53:16] cf2bd finished successfully
Time (s): cpu = 00:00:02 ; elapsed = 00:00:02 . Memory (MB): peak = 2279.844 ; gain = 0.000 ; free physical = 2169 ; free virtual = 37164
INFO: [v++ 60-1441] [04:53:16] Run run_link: Step system_link: Completed
Time (s): cpu = 00:00:12 ; elapsed = 00:00:10 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 2211 ; free virtual = 37207
INFO: [v++ 60-1443] [04:53:16] Run run_link: Step cf2sw: Started
INFO: [v++ 60-1453] Command Line: cf2sw -sdsl /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/sdsl.dat -rtd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/cf2sw.rtd -nofilter /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/cf2sw_full.rtd -xclbin /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/xclbin_orig.xml -o /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/xclbin_orig.1.xml
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [v++ 60-1441] [04:53:18] Run run_link: Step cf2sw: Completed
Time (s): cpu = 00:00:02 ; elapsed = 00:00:02 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 2208 ; free virtual = 37206
INFO: [v++ 60-1443] [04:53:18] Run run_link: Step rtd2_system_diagram: Started
INFO: [v++ 60-1453] Command Line: rtd2SystemDiagram
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [v++ 60-1441] [04:53:18] Run run_link: Step rtd2_system_diagram: Completed
Time (s): cpu = 00:00:00 ; elapsed = 00:00:00.11 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 2208 ; free virtual = 37206
INFO: [v++ 60-1443] [04:53:18] Run run_link: Step vpl: Started
INFO: [v++ 60-1453] Command Line: vpl -t hw -f /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/kv260_median/export/kv260_median/kv260_median.xpfm --remote_ip_cache /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/ip_cache -s --output_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int --log_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/logs/link --report_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link --config /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/vplConfig.ini -k /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/kernel_info.dat --webtalk_flag Vitis --temp_dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link --no-info --iprepo /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/xo/ip_repo/xilinx_com_RTLKernel_DPUCZDX8G_1_0 --messageDb /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link/vpl.pb /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dr.bd.tcl
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link

****** vpl v2022.1 (64-bit)
  **** SW Build 3524075 on 2022-04-13-17:42:45
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.

INFO: [VPL 60-839] Read in kernel information from file '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/kernel_info.dat'.
INFO: [VPL 60-423]   Target device: kv260_median
INFO: [VPL 60-1032] Extracting hardware platform to /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/vivado/vpl/.local/hw_platform
[04:53:28] Run vpl: Step create_project: Started
Creating Vivado project.
[04:53:38] Run vpl: Step create_project: Completed
[04:53:38] Run vpl: Step create_bd: Started
[04:53:49] Run vpl: Step create_bd: Completed
[04:53:49] Run vpl: Step update_bd: Started
[04:53:49] Run vpl: Step update_bd: Completed
[04:53:49] Run vpl: Step generate_target: Started
[04:54:36] Run vpl: Step generate_target: Completed
[04:54:36] Run vpl: Step config_hw_runs: Started
[04:54:39] Run vpl: Step config_hw_runs: Completed
[04:54:39] Run vpl: Step synth: Started
[04:55:09] Block-level synthesis in progress, 0 of 8 jobs complete, 2 jobs running.
[04:55:39] Block-level synthesis in progress, 0 of 8 jobs complete, 2 jobs running.
[04:56:09] Block-level synthesis in progress, 2 of 8 jobs complete, 2 jobs running.
[04:56:40] Block-level synthesis in progress, 2 of 8 jobs complete, 2 jobs running.
[04:57:10] Block-level synthesis in progress, 4 of 8 jobs complete, 2 jobs running.
[04:57:40] Block-level synthesis in progress, 4 of 8 jobs complete, 2 jobs running.
[04:58:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[04:58:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[04:59:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[04:59:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:00:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:00:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:01:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:01:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:02:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:02:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:03:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:03:40] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:04:10] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:04:41] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:05:11] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:05:41] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:06:11] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:06:41] Block-level synthesis in progress, 5 of 8 jobs complete, 1 job running.
[05:07:11] Block-level synthesis in progress, 6 of 8 jobs complete, 1 job running.
[05:07:41] Block-level synthesis in progress, 6 of 8 jobs complete, 1 job running.
[05:07:54] Run vpl: Step synth: Completed
[05:07:54] Run vpl: Step impl: Started
[05:09:56] Finished 2nd of 6 tasks (FPGA linking synthesized kernels to platform). Elapsed time: 00h 16m 35s 

[05:09:56] Starting logic optimization..
[05:10:26] Phase 1 Retarget
[05:10:56] Phase 2 Constant propagation
[05:10:56] Phase 3 Sweep
[05:10:56] Phase 4 BUFG optimization
[05:10:56] Phase 5 Shift Register Optimization
[05:10:56] Phase 6 Post Processing Netlist
[05:12:56] Finished 3rd of 6 tasks (FPGA logic optimization). Elapsed time: 00h 03m 00s 

[05:12:56] Starting logic placement..
[05:13:26] Phase 1 Placer Initialization
[05:13:26] Phase 1.1 Placer Initialization Netlist Sorting
[05:13:26] Phase 1.2 IO Placement/ Clock Placement/ Build Placer Device
[05:13:26] Phase 1.3 Build Placer Netlist Model
[05:14:27] Phase 1.4 Constrain Clocks/Macros
[05:14:27] Phase 2 Global Placement
[05:14:27] Phase 2.1 Floorplanning
[05:14:27] Phase 2.1.1 Partition Driven Placement
[05:14:27] Phase 2.1.1.1 PBP: Partition Driven Placement
[05:15:27] Phase 2.1.1.2 PBP: Clock Region Placement
[05:15:27] Phase 2.1.1.3 PBP: Discrete Incremental
[05:15:27] Phase 2.1.1.4 PBP: Compute Congestion
[05:15:27] Phase 2.1.1.5 PBP: Macro Placement
[05:15:27] Phase 2.1.1.6 PBP: UpdateTiming
[05:15:27] Phase 2.1.1.7 PBP: Add part constraints
[05:15:27] Phase 2.2 Update Timing before SLR Path Opt
[05:15:27] Phase 2.3 Post-Processing in Floorplanning
[05:15:27] Phase 2.4 Global Placement Core
[05:17:58] Phase 2.4.1 Physical Synthesis In Placer
[05:18:28] Phase 3 Detail Placement
[05:18:28] Phase 3.1 Commit Multi Column Macros
[05:18:28] Phase 3.2 Commit Most Macros & LUTRAMs
[05:18:28] Phase 3.3 Small Shape DP
[05:18:28] Phase 3.3.1 Small Shape Clustering
[05:18:28] Phase 3.3.2 Flow Legalize Slice Clusters
[05:18:58] Phase 3.3.3 Slice Area Swap
[05:18:58] Phase 3.3.3.1 Slice Area Swap Initial
[05:18:58] Phase 3.4 Re-assign LUT pins
[05:18:58] Phase 3.5 Pipeline Register Optimization
[05:19:28] Phase 4 Post Placement Optimization and Clean-Up
[05:19:28] Phase 4.1 Post Commit Optimization
[05:20:29] Phase 4.1.1 Post Placement Optimization
[05:20:29] Phase 4.1.1.1 BUFG Insertion
[05:20:29] Phase 1 Physical Synthesis Initialization
[05:20:29] Phase 4.1.1.2 Post Placement Timing Optimization
[05:20:59] Phase 4.2 Post Placement Cleanup
[05:20:59] Phase 4.3 Placer Reporting
[05:20:59] Phase 4.3.1 Print Estimated Congestion
[05:20:59] Phase 4.4 Final Placement Cleanup
[05:21:29] Finished 4th of 6 tasks (FPGA logic placement). Elapsed time: 00h 08m 32s 

[05:21:29] Starting logic routing..
[05:21:59] Phase 1 Build RT Design
[05:22:30] Phase 2 Router Initialization
[05:22:30] Phase 2.1 Fix Topology Constraints
[05:22:30] Phase 2.2 Pre Route Cleanup
[05:22:30] Phase 2.3 Global Clock Net Routing
[05:22:30] Phase 2.4 Update Timing
[05:23:30] Phase 3 Initial Routing
[05:23:30] Phase 3.1 Global Routing
[05:24:00] Phase 4 Rip-up And Reroute
[05:24:00] Phase 4.1 Global Iteration 0
[05:34:34] Phase 4.2 Global Iteration 1
[05:35:04] Phase 5 Delay and Skew Optimization
[05:35:04] Phase 5.1 Delay CleanUp
[05:35:04] Phase 5.1.1 Update Timing
[05:35:04] Phase 5.2 Clock Skew Optimization
[05:35:04] Phase 6 Post Hold Fix
[05:35:04] Phase 6.1 Hold Fix Iter
[05:35:04] Phase 6.1.1 Update Timing
[05:35:34] Phase 7 Route finalize
[05:35:34] Phase 8 Verifying routed nets
[05:35:34] Phase 9 Depositing Routes
[05:35:34] Phase 10 Resolve XTalk
[05:35:34] Phase 11 Post Router Timing
[05:36:04] Finished 5th of 6 tasks (FPGA routing). Elapsed time: 00h 14m 35s 

[05:36:04] Starting bitstream generation..
[05:38:02] Run vpl: Step impl: Completed
[05:38:03] Creating bitmap...
[05:38:03] Writing bitstream ./system_wrapper.bit...
[05:38:03] Finished 6th of 6 tasks (FPGA bitstream generation). Elapsed time: 00h 01m 58s 
[05:38:03] Run vpl: FINISHED. Run Status: impl Complete!
INFO: [v++ 60-1441] [05:38:03] Run run_link: Step vpl: Completed
Time (s): cpu = 00:00:15 ; elapsed = 00:44:45 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 5747 ; free virtual = 36307
INFO: [v++ 60-1443] [05:38:03] Run run_link: Step rtdgen: Started
INFO: [v++ 60-1453] Command Line: rtdgen
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [v++ 60-1453] Command Line: cf2sw -a /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/address_map.xml -sdsl /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/sdsl.dat -xclbin /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/xclbin_orig.xml -rtd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu.rtd -o /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu.xml
INFO: [v++ 60-1652] Cf2sw returned exit code: 0
INFO: [v++ 60-1441] [05:38:04] Run run_link: Step rtdgen: Completed
Time (s): cpu = 00:00:02 ; elapsed = 00:00:02 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 5746 ; free virtual = 36306
INFO: [v++ 60-1443] [05:38:04] Run run_link: Step xclbinutil: Started
INFO: [v++ 60-1453] Command Line: xclbinutil --add-section BITSTREAM:RAW:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/system.bit --force --target hw --key-value SYS:dfx_enable:false --add-section :JSON:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu.rtd --add-section CLOCK_FREQ_TOPOLOGY:JSON:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu_xml.rtd --add-section BUILD_METADATA:JSON:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu_build.rtd --add-section EMBEDDED_METADATA:RAW:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu.xml --add-section SYSTEM_METADATA:RAW:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/systemDiagramModelSlrBaseAddress.json --key-value SYS:PlatformVBNV:xilinx_kv260_kv260_median_platform_0_0 --output /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
XRT Build Version: 2.11.634 (2021.1)
       Build Date: 2021-06-08 22:10:49
          Hash ID: 5ad5998d67080f00bca5bf15b3838cf35e0a7b26
Creating a default 'in-memory' xclbin image.

Section: 'BITSTREAM'(0) was successfully added.
Size   : 7797810 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/system.bit'

Section: 'MEM_TOPOLOGY'(6) was successfully added.
Format : JSON
File   : 'mem_topology'

Section: 'IP_LAYOUT'(8) was successfully added.
Format : JSON
File   : 'ip_layout'

Section: 'CONNECTIVITY'(7) was successfully added.
Format : JSON
File   : 'connectivity'
WARNING: Skipping CLOCK_FREQ_TOPOLOGY section for count size is zero.
WARNING: Section 'CLOCK_FREQ_TOPOLOGY' content is empty.  No data in the given JSON file.

Section: 'CLOCK_FREQ_TOPOLOGY'(11) was empty.  No action taken.
Format : JSON
File   : '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu_xml.rtd'

Section: 'BUILD_METADATA'(14) was successfully added.
Size   : 4399 bytes
Format : JSON
File   : '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu_build.rtd'

Section: 'EMBEDDED_METADATA'(2) was successfully added.
Size   : 4530 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/dpu.xml'

Section: 'SYSTEM_METADATA'(22) was successfully added.
Size   : 18467 bytes
Format : RAW
File   : '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/int/systemDiagramModelSlrBaseAddress.json'
Successfully wrote (7836229 bytes) to the output file: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin
Leaving xclbinutil.
INFO: [v++ 60-1441] [05:38:05] Run run_link: Step xclbinutil: Completed
Time (s): cpu = 00:00:00.13 ; elapsed = 00:00:00.36 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 5740 ; free virtual = 36309
INFO: [v++ 60-1443] [05:38:05] Run run_link: Step xclbinutilinfo: Started
INFO: [v++ 60-1453] Command Line: xclbinutil --quiet --force --info /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin.info --input /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [v++ 60-1441] [05:38:05] Run run_link: Step xclbinutilinfo: Completed
Time (s): cpu = 00:00:00.17 ; elapsed = 00:00:00.2 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 5896 ; free virtual = 36465
INFO: [v++ 60-1443] [05:38:05] Run run_link: Step generate_sc_driver: Started
INFO: [v++ 60-1453] Command Line: 
INFO: [v++ 60-1454] Run Directory: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/link/run_link
INFO: [v++ 60-1441] [05:38:05] Run run_link: Step generate_sc_driver: Completed
Time (s): cpu = 00:00:00 ; elapsed = 00:00:00 . Memory (MB): peak = 2218.625 ; gain = 0.000 ; free physical = 5896 ; free virtual = 36465
INFO: [v++ 60-244] Generating system estimate report...
INFO: [v++ 60-1092] Generated system estimate report: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link/system_estimate_dpu.xtxt
INFO: [v++ 60-2397] Platform default or user specified output type sd_card detected but is not a supported output for v++ --link. Use the v++ --package option instead to create SD card output.
INFO: [v++ 60-586] Created dpu.xclbin
INFO: [v++ 60-1307] Run completed. Additional information can be found in:
    Guidance: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link/link_guidance.html
    Timing Report: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/reports/link/imp/impl_1_system_wrapper_timing_summary_routed.rpt
    Vivado Log: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/logs/link/vivado.log
    Steps Log File: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.build/logs/link/link.steps.log

INFO: [v++ 60-2343] Use the vitis_analyzer tool to visualize and navigate the relevant reports. Run the following command. 
    vitis_analyzer /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/dpuprj_system_hw_link/Hardware/dpu.xclbin.link_summary 
INFO: [v++ 60-791] Total elapsed time: 0h 45m 11s
INFO: [v++ 60-1653] Closing dispatch client.

  1. 2022年11月14日 05:26 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する6

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する5”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、従来から使用している KV260 の Petalinux 2022.1 に Vitis-AI を dnf でインストールした。今回は、ホストパソコン上で、sysroot を生成し、DPUCZDX8G をダウンロードし、Vitis 2022.1 の kv260_median_pkg ワークスペースでライブラリのリポジトリに DPUCZDX8G を追加した。

kv260_median_platform/kv260_median_pkg/sysroot ディレクトリを削除した。
kv260_median_DPU_29_221113.png

kv260_median_platform/kv260_median_plnx/images/linux ディレクトリに行って sdk.sh を起動して、kv260_median_platform/kv260_median_pkg/sysroot ディレクトリを生成した。
./sdk.sh -d /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg
kv260_median_DPU_30_221113.png

kv260_median_platform/kv260_median_pkg/sysroot ディレクトリが生成されて、その下に cortexa72-cortexa53-xilinx-linux ディレクトリと x86_64-petalinux-linux ディレクトリが生成された。
kv260_median_DPU_31_221113.png

kv260_median_platform ディレクトリに DPU ディレクトリを作成した。
kv260_median_DPU_32_221113.png

Vitis-AI/reference_design/ から DPUCZDX8G のダウンロード・リンクをクリックして、DPUCZDX8G.tar.gz をダウンロードした。
kv260_median_DPU_33_221113.png

DPUCZDX8G.tar.gz を展開すると DPUCZDX8G ディレクトリができた。
kv260_median_DPU_34_221113.png

DPUCZDX8G ディレクトリの内容を示す。
kv260_median_DPU_35_221113.png

Vitis 2022.1 を起動する。
vitis &

kv260_median_platform/kv260_median_pkg ワークスペースをロードした。

Window メニューから Preferences を選択する。
Preferences ダイアログが開く。
Xilinx の下の Library Repositories をクリックして、Add ボタンをクリックする。
kv260_median_DPU_36_221113.png

Repository に Nice Name が追加された。
Git URL と Branch の内容を削除する。
kv260_median_DPU_37_221113.png

Location に DPUCZDX8G ディレクトリのフルパスを入力した。
kv260_median_DPU_38_221113.png

Apply and Close ボタンをクリックした。
  1. 2022年11月13日 04:56 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する5

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する4”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、作成した Petalinux 2022.1 イメージを balenaEtcher で MicroSD カードに書き込んで、KV260 でブートしてみたところ、途中で止まってしまった。今回は、従来から使用している KV260 の Petalinux 2022.1 に Vitis-AI を dnf でインストールしてみよう。

前回は、ホストパソコン上の Petalinux 2022.1 で Vitis-AI ライブラリと OpenCV ライブラリを RootFS に加えてビルドはできたが、作成した MicroSD カードでは KV260 に挿入して Petaliunx 2022.1 のブートができなかった。Vitis での Vitis-AI の使用は RootFS に Vitis-AI が入っているので、大丈夫だろうから、問題は、KV260 の Petalinux 2022.1 での Vitis-AI のインストールということになる。そこで、dnf で Vitis-AI をインストールできないか?探ってみよう。

まずは dnf search で Vitis-AI が無いか?を探ってみよう。
dnf search vitis-ai
kv260_median_DPU_20_221111.png

vitis-ai-library.cortexa72_cortexa53 : Vitis AI LIBRARY
vitis-ai-library-dbg.cortexa72_cortexa53 : Vitis AI LIBRARY - Debugging files
vitis-ai-library-dev.cortexa72_cortexa53 : Vitis AI LIBRARY - Development files
vitis-ai-library-lic.cortexa72_cortexa53 : Vitis AI LIBRARY
vitis-ai-library-src.cortexa72_cortexa53 : Vitis AI LIBRARY - Source files

があるようだ。
libvitis_ai_library.aarch64 をインストールしてみたが、依存関係があってインストールできなかった。
sudo dnf install libvitis_ai_library.aarch64
kv260_median_DPU_21_221111.png
kv260_median_DPU_22_221111.png

思い出してみたら、MicroSD カードを作成したところで、Vitis-AI をインストールしてあるんだった。(”KV260 用 Petalinux 2022.1 のイメージを MicroSD カードに書いた2”参照)
なので、その時にインストールした Vitis-AI を削除する。
sudo dnf remove libunilog-2.5.0-r61
sudo dnf remove libxir-2.5.0-r61
sudo dnf remove libtarget-factory-2.5.0-r61
sudo dnf remove libvart-2.5.0-r61
sudo dnf remove libvitis_ai_library-2.5.0-r61

最初の libxir-2.5.0-r61 を削除したところで、全てのライブラリが削除されたような???
kv260_median_DPU_24_221111.png

petalinux-build でビルドしたときとライブラリを合わせるために、vitis-ai-library.cortexa72_cortexa53 と vitis-ai-library-dev.cortexa72_cortexa53 をインストールする。
sudo dnf install vitis-ai-library.cortexa72_cortexa53
kv260_median_DPU_25_221111.png
kv260_median_DPU_26_221111.png

sudo dnf install vitis-ai-library-dev.cortexa72_cortexa53
kv260_median_DPU_27_221111.png
kv260_median_DPU_28_221111.png

vitis-ai-library.cortexa72_cortexa53 をインストールした時のログを示す。

xilinx-k26-starterkit-20221:~$ sudo dnf install vitis-ai-library.cortexa72_cortexa53
Last metadata expiration check: 0:25:05 ago on Fri Nov 11 04:17:42 2022.
Dependencies resolved.
================================================================================
 Package          Architecture        Version            Repository        Size
================================================================================
Installing:
 libdfx1.0        cortexa72_cortexa53 1.0-r0.2           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           13 k
     replacing  libdfx.cortexa72_cortexa53 1.0-r0.0
 vitis-ai-library cortexa72_cortexa53 2.5-r0.4           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          3.1 M
Upgrading:
 dfx-mgr          cortexa72_cortexa53 1.0-r0.2           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           50 k
 xrt              cortexa72_cortexa53 202220.2.14.0-r0.0 oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          2.1 M
Installing dependencies:
 python3-graphviz cortexa72_cortexa53 0.17-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           33 k
 python3-protobuf cortexa72_cortexa53 3.17.3-r0.0        oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          291 k
 target-factory   cortexa72_cortexa53 2.5-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           86 k
 unilog           cortexa72_cortexa53 2.5-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           25 k
 vart             cortexa72_cortexa53 2.5-r0.4           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          636 k
 xir              cortexa72_cortexa53 2.5-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          729 k

Transaction Summary
================================================================================
Install  8 Packages
Upgrade  2 Packages

Total size: 7.0 M
Is this ok [y/N]: y
Downloading Packages:
[SKIPPED] libdfx1.0-1.0-r0.2.cortexa72_cortexa53.rpm: Already downloaded       
[SKIPPED] python3-graphviz-0.17-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] python3-protobuf-3.17.3-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] target-factory-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded  
[SKIPPED] unilog-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded          
[SKIPPED] vart-2.5-r0.4.cortexa72_cortexa53.rpm: Already downloaded            
[SKIPPED] vitis-ai-library-2.5-r0.4.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] xir-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded             
[SKIPPED] dfx-mgr-1.0-r0.2.cortexa72_cortexa53.rpm: Already downloaded         
[SKIPPED] xrt-202220.2.14.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded   
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : unilog-2.5-r0.0.cortexa72_cortexa53                   1/13 
  Running scriptlet: unilog-2.5-r0.0.cortexa72_cortexa53                   1/13 
%post(unilog-2.5-r0.0.cortexa72_cortexa53): scriptlet start
%post(unilog-2.5-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3212
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(unilog-2.5-r0.0.cortexa72_cortexa53): waitpid(3212) rc 3212 status 0

  Installing       : xir-2.5-r0.0.cortexa72_cortexa53                      2/13 
  Running scriptlet: xir-2.5-r0.0.cortexa72_cortexa53                      2/13 
%post(xir-2.5-r0.0.cortexa72_cortexa53): scriptlet start
%post(xir-2.5-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3214
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(xir-2.5-r0.0.cortexa72_cortexa53): waitpid(3214) rc 3214 status 0

  Installing       : libdfx1.0-1.0-r0.2.cortexa72_cortexa53                3/13 
  Running scriptlet: libdfx1.0-1.0-r0.2.cortexa72_cortexa53                3/13 
%post(libdfx1.0-1.0-r0.2.cortexa72_cortexa53): scriptlet start
%post(libdfx1.0-1.0-r0.2.cortexa72_cortexa53): execv(/bin/sh) pid 3216
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libdfx1.0-1.0-r0.2.cortexa72_cortexa53): waitpid(3216) rc 3216 status 0

  Upgrading        : xrt-202220.2.14.0-r0.0.cortexa72_cortexa53            4/13 
  Running scriptlet: xrt-202220.2.14.0-r0.0.cortexa72_cortexa53            4/13 
%post(xrt-202220.2.14.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(xrt-202220.2.14.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3218
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
+ '[' -n '' ']'
+ '[' '!' -e /etc/OpenCL/vendors/xilinx.icd ']'
%post(xrt-202220.2.14.0-r0.0.cortexa72_cortexa53): waitpid(3218) rc 3218 status 0

  Installing       : vart-2.5-r0.4.cortexa72_cortexa53                     5/13 
  Running scriptlet: vart-2.5-r0.4.cortexa72_cortexa53                     5/13 
%post(vart-2.5-r0.4.cortexa72_cortexa53): scriptlet start
%post(vart-2.5-r0.4.cortexa72_cortexa53): execv(/bin/sh) pid 3224
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(vart-2.5-r0.4.cortexa72_cortexa53): waitpid(3224) rc 3224 status 0

  Installing       : target-factory-2.5-r0.0.cortexa72_cortexa53           6/13 
  Running scriptlet: target-factory-2.5-r0.0.cortexa72_cortexa53           6/13 
%post(target-factory-2.5-r0.0.cortexa72_cortexa53): scriptlet start
%post(target-factory-2.5-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3226
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(target-factory-2.5-r0.0.cortexa72_cortexa53): waitpid(3226) rc 3226 status 0

  Installing       : python3-protobuf-3.17.3-r0.0.cortexa72_cortexa53      7/13 
  Installing       : python3-graphviz-0.17-r0.0.cortexa72_cortexa53        8/13 
  Installing       : vitis-ai-library-2.5-r0.4.cortexa72_cortexa53         9/13 
  Running scriptlet: vitis-ai-library-2.5-r0.4.cortexa72_cortexa53         9/13 
%post(vitis-ai-library-2.5-r0.4.cortexa72_cortexa53): scriptlet start
%post(vitis-ai-library-2.5-r0.4.cortexa72_cortexa53): execv(/bin/sh) pid 3228
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(vitis-ai-library-2.5-r0.4.cortexa72_cortexa53): waitpid(3228) rc 3228 status 0

  Upgrading        : dfx-mgr-1.0-r0.2.cortexa72_cortexa53                 10/13 
  Running scriptlet: dfx-mgr-1.0-r0.2.cortexa72_cortexa53                 10/13 
%post(dfx-mgr-1.0-r0.2.cortexa72_cortexa53): scriptlet start
%post(dfx-mgr-1.0-r0.2.cortexa72_cortexa53): execv(/bin/sh) pid 3230
+ set -e
+ systemctl
+ OPTS=
+ '[' -n '' ']'
+ '[' enable = enable ']'
+ for service in dfx-mgr.service
+ systemctl enable dfx-mgr.service
+ '[' -z '' ']'
+ systemctl daemon-reload
+ systemctl preset dfx-mgr.service
+ '[' enable = enable ']'
+ systemctl --no-block restart dfx-mgr.service
+ '[' -n '' -o '!' -d /run/systemd/system ']'
%post(dfx-mgr-1.0-r0.2.cortexa72_cortexa53): waitpid(3230) rc 3230 status 0

  Running scriptlet: dfx-mgr-1.0-r0.0.cortexa72_cortexa53                 11/13 
%preun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): scriptlet start
%preun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3274
+ '[' 1 = 0 ']'
%preun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): waitpid(3274) rc 3274 status 0

  Cleanup          : dfx-mgr-1.0-r0.0.cortexa72_cortexa53                 11/13 
  Running scriptlet: dfx-mgr-1.0-r0.0.cortexa72_cortexa53                 11/13 
%postun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): scriptlet start
%postun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3275
+ '[' 1 = 0 ']'
%postun(dfx-mgr-1.0-r0.0.cortexa72_cortexa53): waitpid(3275) rc 3275 status 0

  Cleanup          : xrt-202210.2.13.0-r0.0.cortexa72_cortexa53           12/13 
  Obsoleting       : libdfx-1.0-r0.0.cortexa72_cortexa53                  13/13 
  Verifying        : libdfx1.0-1.0-r0.2.cortexa72_cortexa53                1/13 
  Verifying        : libdfx-1.0-r0.0.cortexa72_cortexa53                   2/13 
  Verifying        : python3-graphviz-0.17-r0.0.cortexa72_cortexa53        3/13 
  Verifying        : python3-protobuf-3.17.3-r0.0.cortexa72_cortexa53      4/13 
  Verifying        : target-factory-2.5-r0.0.cortexa72_cortexa53           5/13 
  Verifying        : unilog-2.5-r0.0.cortexa72_cortexa53                   6/13 
  Verifying        : vart-2.5-r0.4.cortexa72_cortexa53                     7/13 
  Verifying        : vitis-ai-library-2.5-r0.4.cortexa72_cortexa53         8/13 
  Verifying        : xir-2.5-r0.0.cortexa72_cortexa53                      9/13 
  Verifying        : dfx-mgr-1.0-r0.2.cortexa72_cortexa53                 10/13 
  Verifying        : dfx-mgr-1.0-r0.0.cortexa72_cortexa53                 11/13 
  Verifying        : xrt-202220.2.14.0-r0.0.cortexa72_cortexa53           12/13 
  Verifying        : xrt-202210.2.13.0-r0.0.cortexa72_cortexa53           13/13 

Upgraded:
  dfx-mgr-1.0-r0.2.cortexa72_cortexa53                                          
  xrt-202220.2.14.0-r0.0.cortexa72_cortexa53                                    
Installed:
  libdfx1.0-1.0-r0.2.cortexa72_cortexa53                                        
  python3-graphviz-0.17-r0.0.cortexa72_cortexa53                                
  python3-protobuf-3.17.3-r0.0.cortexa72_cortexa53                              
  target-factory-2.5-r0.0.cortexa72_cortexa53                                   
  unilog-2.5-r0.0.cortexa72_cortexa53                                           
  vart-2.5-r0.4.cortexa72_cortexa53                                             
  vitis-ai-library-2.5-r0.4.cortexa72_cortexa53                                 
  xir-2.5-r0.0.cortexa72_cortexa53                                              

Complete!


vitis-ai-library-dev.cortexa72_cortexa53 をインストールした時のログを示す。

xilinx-k26-starterkit-20221:~$ sudo dnf install vitis-ai-library-dev.cortexa72_cortexa53
Last metadata expiration check: 0:28:02 ago on Fri Nov 11 04:17:42 2022.
Dependencies resolved.
================================================================================
 Package                     Architecture        Version              Repo
                                                                           Size
================================================================================
Installing:
 vitis-ai-library-dev        cortexa72_cortexa53 2.5-r0.4             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          354 k
Installing dependencies:
 boost                       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          6.6 k
 boost-log                   cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          397 k
 boost-math                  cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          307 k
 boost-serialization         cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           97 k
 boost-test                  cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          212 k
 googletest                  cortexa72_cortexa53 1.11.0+git0+e2239ee604-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          5.8 k
 googletest-staticdev        cortexa72_cortexa53 1.11.0+git0+e2239ee604-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          166 k
 libboost-atomic1.77.0       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           12 k
 libboost-chrono1.77.0       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           18 k
 libboost-container1.77.0    cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           35 k
 libboost-context1.77.0      cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          9.6 k
 libboost-contract1.77.0     cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           33 k
 libboost-coroutine1.77.0    cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           23 k
 libboost-date-time1.77.0    cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          8.3 k
 libboost-fiber1.77.0        cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           31 k
 libboost-graph1.77.0        cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          123 k
 libboost-iostreams1.77.0    cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           28 k
 libboost-locale1.77.0       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          199 k
 libboost-python39-1.77.0    cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           72 k
 libboost-random1.77.0       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           18 k
 libboost-regex1.77.0        cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           89 k
 libboost-thread1.77.0       cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           37 k
 libboost-timer1.77.0        cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           18 k
 libboost-type-erasure1.77.0 cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           22 k
 libboost-wave1.77.0         cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          183 k
 libprotobuf-c-compiler      cortexa72_cortexa53 1.3.3-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           59 k
 libprotobuf-c1              cortexa72_cortexa53 1.3.3-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           22 k
 libprotobuf-compiler        cortexa72_cortexa53 3.18.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          733 k
 libprotobuf-lite29          cortexa72_cortexa53 3.18.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          177 k
 opencl-headers              cortexa72_cortexa53 git-r0.0             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          5.6 k
 python3-pybind11            cortexa72_cortexa53 2.7.0-r0.1           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          157 k
 rapidjson                   cortexa72_cortexa53 1.1.0+git0+0ccdbf364c-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          5.8 k
Installing weak dependencies:
 boost-dev                   cortexa72_cortexa53 1.77.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           11 M
 googletest-dev              cortexa72_cortexa53 1.11.0+git0+e2239ee604-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          173 k
 graphviz-dev                cortexa72_cortexa53 2.44.1-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           36 k
 libcroco-dev                cortexa72_cortexa53 0.6.13-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           28 k
 libdfx-dev                  cortexa72_cortexa53 1.0-r0.2             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          7.2 k
 libjson-c-dev               cortexa72_cortexa53 0.15-r0.0            oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           32 k
 libopencl-dev               cortexa72_cortexa53 2.3.0-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           13 k
 libprotobuf-c-dev           cortexa72_cortexa53 1.3.3-r0.0           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           16 k
 libprotobuf-dev             cortexa72_cortexa53 3.18.0-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          342 k
 librsvg-2-dev               cortexa72_cortexa53 2.40.21-r0.0         oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           17 k
 opencl-clhpp-dev            cortexa72_cortexa53 2.0.15+git0+f7237f3799-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           45 k
 opencl-headers-dev          cortexa72_cortexa53 git-r0.0             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           41 k
 python3-graphviz-dev        cortexa72_cortexa53 0.17-r0.0            oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          6.0 k
 python3-protobuf-dev        cortexa72_cortexa53 3.17.3-r0.0          oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          6.2 k
 python3-pybind11-dev        cortexa72_cortexa53 2.7.0-r0.1           oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          139 k
 rapidjson-dev               cortexa72_cortexa53 1.1.0+git0+0ccdbf364c-r0.0
                                                                      oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                          103 k
 target-factory-dev          cortexa72_cortexa53 2.5-r0.0             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           37 k
 unilog-dev                  cortexa72_cortexa53 2.5-r0.0             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           14 k
 vart-dev                    cortexa72_cortexa53 2.5-r0.4             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           45 k
 xir-dev                     cortexa72_cortexa53 2.5-r0.0             oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           22 k
 xrt-dev                     cortexa72_cortexa53 202220.2.14.0-r0.0   oe-remote-repo-sswreleases-rel-v2022-generic-rpm-cortexa72_cortexa53
                                                                           91 k
 zocl-dev                    xilinx_k26_kv       202210.2.13.0-r0.0   oe-remote-repo-sswreleases-rel-v2022-generic-rpm-xilinx_k26_kv
                                                                          6.7 k

Transaction Summary
================================================================================
Install  55 Packages

Total size: 16 M
Installed size: 161 M
Is this ok [y/N]: y
Downloading Packages:
[SKIPPED] boost-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded        
[SKIPPED] boost-dev-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded    
[SKIPPED] boost-log-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded    
[SKIPPED] boost-math-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded   
[SKIPPED] boost-serialization-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] boost-test-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded   
[SKIPPED] googletest-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] googletest-dev-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] googletest-staticdev-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] graphviz-dev-2.44.1-r0.0.cortexa72_cortexa53.rpm: Already downloaded 
[SKIPPED] libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-container1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-context1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libcroco-dev-0.6.13-r0.0.cortexa72_cortexa53.rpm: Already downloaded 
[SKIPPED] libdfx-dev-1.0-r0.2.cortexa72_cortexa53.rpm: Already downloaded      
[SKIPPED] libjson-c-dev-0.15-r0.0.cortexa72_cortexa53.rpm: Already downloaded  
[SKIPPED] libopencl-dev-2.3.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded 
[SKIPPED] libprotobuf-c-compiler-1.3.3-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libprotobuf-c-dev-1.3.3-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libprotobuf-dev-3.18.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] librsvg-2-dev-2.40.21-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] opencl-clhpp-dev-2.0.15+git0+f7237f3799-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] opencl-headers-dev-git-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] opencl-headers-git-r0.0.cortexa72_cortexa53.rpm: Already downloaded  
[SKIPPED] python3-graphviz-dev-0.17-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] python3-protobuf-dev-3.17.3-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] python3-pybind11-2.7.0-r0.1.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] python3-pybind11-dev-2.7.0-r0.1.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] rapidjson-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] rapidjson-dev-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] target-factory-dev-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] unilog-dev-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded      
[SKIPPED] vart-dev-2.5-r0.4.cortexa72_cortexa53.rpm: Already downloaded        
[SKIPPED] vitis-ai-library-dev-2.5-r0.4.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] xir-dev-2.5-r0.0.cortexa72_cortexa53.rpm: Already downloaded         
[SKIPPED] xrt-dev-202220.2.14.0-r0.0.cortexa72_cortexa53.rpm: Already downloaded
[SKIPPED] zocl-dev-202210.2.13.0-r0.0.xilinx_k26_kv.rpm: Already downloaded    
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortex    1/55 
  Running scriptlet: libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortex    1/55 
%post(libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3436
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3436) rc 3436 status 0

  Installing       : libboost-context1.77.0-1.77.0-r0.0.cortexa72_corte    2/55 
  Running scriptlet: libboost-context1.77.0-1.77.0-r0.0.cortexa72_corte    2/55 
%post(libboost-context1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-context1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3438
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-context1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3438) rc 3438 status 0

  Installing       : libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortex    3/55 
  Running scriptlet: libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortex    3/55 
%post(libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3440
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3440) rc 3440 status 0

  Installing       : libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa    4/55 
  Running scriptlet: libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa    4/55 
%post(libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3442
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3442) rc 3442 status 0

  Installing       : libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cor    5/55 
  Running scriptlet: libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cor    5/55 
%post(libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3444
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3444) rc 3444 status 0

  Installing       : libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa    6/55 
  Running scriptlet: libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa    6/55 
%post(libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3446
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3446) rc 3446 status 0

  Installing       : boost-log-1.77.0-r0.0.cortexa72_cortexa53             7/55 
  Running scriptlet: boost-log-1.77.0-r0.0.cortexa72_cortexa53             7/55 
%post(boost-log-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(boost-log-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3448
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(boost-log-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3448) rc 3448 status 0

  Installing       : libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortex    8/55 
  Running scriptlet: libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortex    8/55 
%post(libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3450
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3450) rc 3450 status 0

  Installing       : libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_    9/55 
  Running scriptlet: libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_    9/55 
%post(libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3452
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3452) rc 3452 status 0

  Installing       : libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa5   10/55 
  Running scriptlet: libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa5   10/55 
%post(libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3454
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3454) rc 3454 status 0

  Installing       : libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa   11/55 
  Running scriptlet: libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa   11/55 
%post(libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3456
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa53): waitpid(3456) rc 3456 status 0

  Installing       : libjson-c-dev-0.15-r0.0.cortexa72_cortexa53          12/55 
  Installing       : libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa   13/55 
  Running scriptlet: libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa   13/55 
%post(libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3462
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3462) rc 3462 status 0

  Installing       : libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortex   14/55 
  Running scriptlet: libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortex   14/55 
%post(libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3464
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3464) rc 3464 status 0

  Installing       : libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cor   15/55 
  Running scriptlet: libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cor   15/55 
%post(libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3466
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3466) rc 3466 status 0

  Installing       : libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cor   16/55 
  Running scriptlet: libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cor   16/55 
%post(libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3468
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3468) rc 3468 status 0

  Installing       : libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa   17/55 
  Running scriptlet: libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa   17/55 
%post(libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3470
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3470) rc 3470 status 0

  Installing       : libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cor   18/55 
  Running scriptlet: libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cor   18/55 
%post(libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3472
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3472) rc 3472 status 0

  Installing       : libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cort   19/55 
  Running scriptlet: libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cort   19/55 
%post(libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3474
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3474) rc 3474 status 0

  Installing       : libboost-container1.77.0-1.77.0-r0.0.cortexa72_cor   20/55 
  Running scriptlet: libboost-container1.77.0-1.77.0-r0.0.cortexa72_cor   20/55 
%post(libboost-container1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-container1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3476
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-container1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3476) rc 3476 status 0

  Installing       : libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortex   21/55 
  Running scriptlet: libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortex   21/55 
%post(libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3478
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3478) rc 3478 status 0

  Installing       : boost-test-1.77.0-r0.0.cortexa72_cortexa53           22/55 
  Running scriptlet: boost-test-1.77.0-r0.0.cortexa72_cortexa53           22/55 
%post(boost-test-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(boost-test-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3480
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(boost-test-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3480) rc 3480 status 0

  Installing       : boost-serialization-1.77.0-r0.0.cortexa72_cortexa5   23/55 
  Running scriptlet: boost-serialization-1.77.0-r0.0.cortexa72_cortexa5   23/55 
%post(boost-serialization-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(boost-serialization-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3482
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(boost-serialization-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3482) rc 3482 status 0

  Installing       : boost-math-1.77.0-r0.0.cortexa72_cortexa53           24/55 
  Running scriptlet: boost-math-1.77.0-r0.0.cortexa72_cortexa53           24/55 
%post(boost-math-1.77.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(boost-math-1.77.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3484
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(boost-math-1.77.0-r0.0.cortexa72_cortexa53): waitpid(3484) rc 3484 status 0

  Installing       : boost-1.77.0-r0.0.cortexa72_cortexa53                25/55 
  Installing       : boost-dev-1.77.0-r0.0.cortexa72_cortexa53            26/55 
  Installing       : unilog-dev-2.5-r0.0.cortexa72_cortexa53              27/55 
  Installing       : libprotobuf-c-compiler-1.3.3-r0.0.cortexa72_cortex   28/55 
  Installing       : zocl-dev-202210.2.13.0-r0.0.xilinx_k26_kv            29/55 
  Installing       : rapidjson-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cor   30/55 
  Installing       : rapidjson-dev-1.1.0+git0+0ccdbf364c-r0.0.cortexa72   31/55 
  Installing       : python3-pybind11-2.7.0-r0.1.cortexa72_cortexa53      32/55 
  Installing       : python3-pybind11-dev-2.7.0-r0.1.cortexa72_cortexa5   33/55 
  Installing       : python3-graphviz-dev-0.17-r0.0.cortexa72_cortexa53   34/55 
  Installing       : opencl-headers-git-r0.0.cortexa72_cortexa53          35/55 
  Installing       : opencl-headers-dev-git-r0.0.cortexa72_cortexa53      36/55 
  Installing       : opencl-clhpp-dev-2.0.15+git0+f7237f3799-r0.0.corte   37/55 
  Installing       : libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53   38/55 
  Running scriptlet: libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53   38/55 
%post(libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53): scriptlet start
%post(libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3506
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53): waitpid(3506) rc 3506 status 0

  Installing       : libprotobuf-dev-3.18.0-r0.0.cortexa72_cortexa53      39/55 
  Installing       : python3-protobuf-dev-3.17.3-r0.0.cortexa72_cortexa   40/55 
  Installing       : libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53        41/55 
  Running scriptlet: libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53        41/55 
%post(libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53): scriptlet start
%post(libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53): execv(/bin/sh) pid 3508
+ set -e
+ '[' x = x ']'
+ '[' -x /sbin/ldconfig ']'
+ /sbin/ldconfig
%post(libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53): waitpid(3508) rc 3508 status 0

  Installing       : libprotobuf-c-dev-1.3.3-r0.0.cortexa72_cortexa53     42/55 
  Installing       : target-factory-dev-2.5-r0.0.cortexa72_cortexa53      43/55 
  Installing       : xir-dev-2.5-r0.0.cortexa72_cortexa53                 44/55 
  Installing       : libopencl-dev-2.3.0-r0.0.cortexa72_cortexa53         45/55 
  Installing       : libdfx-dev-1.0-r0.2.cortexa72_cortexa53              46/55 
  Installing       : xrt-dev-202220.2.14.0-r0.0.cortexa72_cortexa53       47/55 
  Installing       : vart-dev-2.5-r0.4.cortexa72_cortexa53                48/55 
  Installing       : libcroco-dev-0.6.13-r0.0.cortexa72_cortexa53         49/55 
  Installing       : librsvg-2-dev-2.40.21-r0.0.cortexa72_cortexa53       50/55 
  Installing       : graphviz-dev-2.44.1-r0.0.cortexa72_cortexa53         51/55 
  Installing       : googletest-1.11.0+git0+e2239ee604-r0.0.cortexa72_c   52/55 
  Installing       : googletest-staticdev-1.11.0+git0+e2239ee604-r0.0.c   53/55 
  Installing       : googletest-dev-1.11.0+git0+e2239ee604-r0.0.cortexa   54/55 
  Installing       : vitis-ai-library-dev-2.5-r0.4.cortexa72_cortexa53    55/55 
  Verifying        : boost-1.77.0-r0.0.cortexa72_cortexa53                 1/55 
  Verifying        : boost-dev-1.77.0-r0.0.cortexa72_cortexa53             2/55 
  Verifying        : boost-log-1.77.0-r0.0.cortexa72_cortexa53             3/55 
  Verifying        : boost-math-1.77.0-r0.0.cortexa72_cortexa53            4/55 
  Verifying        : boost-serialization-1.77.0-r0.0.cortexa72_cortexa5    5/55 
  Verifying        : boost-test-1.77.0-r0.0.cortexa72_cortexa53            6/55 
  Verifying        : googletest-1.11.0+git0+e2239ee604-r0.0.cortexa72_c    7/55 
  Verifying        : googletest-dev-1.11.0+git0+e2239ee604-r0.0.cortexa    8/55 
  Verifying        : googletest-staticdev-1.11.0+git0+e2239ee604-r0.0.c    9/55 
  Verifying        : graphviz-dev-2.44.1-r0.0.cortexa72_cortexa53         10/55 
  Verifying        : libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortex   11/55 
  Verifying        : libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortex   12/55 
  Verifying        : libboost-container1.77.0-1.77.0-r0.0.cortexa72_cor   13/55 
  Verifying        : libboost-context1.77.0-1.77.0-r0.0.cortexa72_corte   14/55 
  Verifying        : libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cort   15/55 
  Verifying        : libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cor   16/55 
  Verifying        : libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cor   17/55 
  Verifying        : libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa   18/55 
  Verifying        : libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa   19/55 
  Verifying        : libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cor   20/55 
  Verifying        : libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortex   21/55 
  Verifying        : libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cor   22/55 
  Verifying        : libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortex   23/55 
  Verifying        : libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa   24/55 
  Verifying        : libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortex   25/55 
  Verifying        : libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa   26/55 
  Verifying        : libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_   27/55 
  Verifying        : libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa5   28/55 
  Verifying        : libcroco-dev-0.6.13-r0.0.cortexa72_cortexa53         29/55 
  Verifying        : libdfx-dev-1.0-r0.2.cortexa72_cortexa53              30/55 
  Verifying        : libjson-c-dev-0.15-r0.0.cortexa72_cortexa53          31/55 
  Verifying        : libopencl-dev-2.3.0-r0.0.cortexa72_cortexa53         32/55 
  Verifying        : libprotobuf-c-compiler-1.3.3-r0.0.cortexa72_cortex   33/55 
  Verifying        : libprotobuf-c-dev-1.3.3-r0.0.cortexa72_cortexa53     34/55 
  Verifying        : libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53        35/55 
  Verifying        : libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa   36/55 
  Verifying        : libprotobuf-dev-3.18.0-r0.0.cortexa72_cortexa53      37/55 
  Verifying        : libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53   38/55 
  Verifying        : librsvg-2-dev-2.40.21-r0.0.cortexa72_cortexa53       39/55 
  Verifying        : opencl-clhpp-dev-2.0.15+git0+f7237f3799-r0.0.corte   40/55 
  Verifying        : opencl-headers-dev-git-r0.0.cortexa72_cortexa53      41/55 
  Verifying        : opencl-headers-git-r0.0.cortexa72_cortexa53          42/55 
  Verifying        : python3-graphviz-dev-0.17-r0.0.cortexa72_cortexa53   43/55 
  Verifying        : python3-protobuf-dev-3.17.3-r0.0.cortexa72_cortexa   44/55 
  Verifying        : python3-pybind11-2.7.0-r0.1.cortexa72_cortexa53      45/55 
  Verifying        : python3-pybind11-dev-2.7.0-r0.1.cortexa72_cortexa5   46/55 
  Verifying        : rapidjson-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cor   47/55 
  Verifying        : rapidjson-dev-1.1.0+git0+0ccdbf364c-r0.0.cortexa72   48/55 
  Verifying        : target-factory-dev-2.5-r0.0.cortexa72_cortexa53      49/55 
  Verifying        : unilog-dev-2.5-r0.0.cortexa72_cortexa53              50/55 
  Verifying        : vart-dev-2.5-r0.4.cortexa72_cortexa53                51/55 
  Verifying        : vitis-ai-library-dev-2.5-r0.4.cortexa72_cortexa53    52/55 
  Verifying        : xir-dev-2.5-r0.0.cortexa72_cortexa53                 53/55 
  Verifying        : xrt-dev-202220.2.14.0-r0.0.cortexa72_cortexa53       54/55 
  Verifying        : zocl-dev-202210.2.13.0-r0.0.xilinx_k26_kv            55/55 

Installed:
  boost-1.77.0-r0.0.cortexa72_cortexa53                                         
  boost-dev-1.77.0-r0.0.cortexa72_cortexa53                                     
  boost-log-1.77.0-r0.0.cortexa72_cortexa53                                     
  boost-math-1.77.0-r0.0.cortexa72_cortexa53                                    
  boost-serialization-1.77.0-r0.0.cortexa72_cortexa53                           
  boost-test-1.77.0-r0.0.cortexa72_cortexa53                                    
  googletest-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53                    
  googletest-dev-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53                
  googletest-staticdev-1.11.0+git0+e2239ee604-r0.0.cortexa72_cortexa53          
  graphviz-dev-2.44.1-r0.0.cortexa72_cortexa53                                  
  libboost-atomic1.77.0-1.77.0-r0.0.cortexa72_cortexa53                         
  libboost-chrono1.77.0-1.77.0-r0.0.cortexa72_cortexa53                         
  libboost-container1.77.0-1.77.0-r0.0.cortexa72_cortexa53                      
  libboost-context1.77.0-1.77.0-r0.0.cortexa72_cortexa53                        
  libboost-contract1.77.0-1.77.0-r0.0.cortexa72_cortexa53                       
  libboost-coroutine1.77.0-1.77.0-r0.0.cortexa72_cortexa53                      
  libboost-date-time1.77.0-1.77.0-r0.0.cortexa72_cortexa53                      
  libboost-fiber1.77.0-1.77.0-r0.0.cortexa72_cortexa53                          
  libboost-graph1.77.0-1.77.0-r0.0.cortexa72_cortexa53                          
  libboost-iostreams1.77.0-1.77.0-r0.0.cortexa72_cortexa53                      
  libboost-locale1.77.0-1.77.0-r0.0.cortexa72_cortexa53                         
  libboost-python39-1.77.0-1.77.0-r0.0.cortexa72_cortexa53                      
  libboost-random1.77.0-1.77.0-r0.0.cortexa72_cortexa53                         
  libboost-regex1.77.0-1.77.0-r0.0.cortexa72_cortexa53                          
  libboost-thread1.77.0-1.77.0-r0.0.cortexa72_cortexa53                         
  libboost-timer1.77.0-1.77.0-r0.0.cortexa72_cortexa53                          
  libboost-type-erasure1.77.0-1.77.0-r0.0.cortexa72_cortexa53                   
  libboost-wave1.77.0-1.77.0-r0.0.cortexa72_cortexa53                           
  libcroco-dev-0.6.13-r0.0.cortexa72_cortexa53                                  
  libdfx-dev-1.0-r0.2.cortexa72_cortexa53                                       
  libjson-c-dev-0.15-r0.0.cortexa72_cortexa53                                   
  libopencl-dev-2.3.0-r0.0.cortexa72_cortexa53                                  
  libprotobuf-c-compiler-1.3.3-r0.0.cortexa72_cortexa53                         
  libprotobuf-c-dev-1.3.3-r0.0.cortexa72_cortexa53                              
  libprotobuf-c1-1.3.3-r0.0.cortexa72_cortexa53                                 
  libprotobuf-compiler-3.18.0-r0.0.cortexa72_cortexa53                          
  libprotobuf-dev-3.18.0-r0.0.cortexa72_cortexa53                               
  libprotobuf-lite29-3.18.0-r0.0.cortexa72_cortexa53                            
  librsvg-2-dev-2.40.21-r0.0.cortexa72_cortexa53                                
  opencl-clhpp-dev-2.0.15+git0+f7237f3799-r0.0.cortexa72_cortexa53              
  opencl-headers-git-r0.0.cortexa72_cortexa53                                   
  opencl-headers-dev-git-r0.0.cortexa72_cortexa53                               
  python3-graphviz-dev-0.17-r0.0.cortexa72_cortexa53                            
  python3-protobuf-dev-3.17.3-r0.0.cortexa72_cortexa53                          
  python3-pybind11-2.7.0-r0.1.cortexa72_cortexa53                               
  python3-pybind11-dev-2.7.0-r0.1.cortexa72_cortexa53                           
  rapidjson-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cortexa53                      
  rapidjson-dev-1.1.0+git0+0ccdbf364c-r0.0.cortexa72_cortexa53                  
  target-factory-dev-2.5-r0.0.cortexa72_cortexa53                               
  unilog-dev-2.5-r0.0.cortexa72_cortexa53                                       
  vart-dev-2.5-r0.4.cortexa72_cortexa53                                         
  vitis-ai-library-dev-2.5-r0.4.cortexa72_cortexa53                             
  xir-dev-2.5-r0.0.cortexa72_cortexa53                                          
  xrt-dev-202220.2.14.0-r0.0.cortexa72_cortexa53                                
  zocl-dev-202210.2.13.0-r0.0.xilinx_k26_kv                                     

Complete!

  1. 2022年11月12日 08:42 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する4

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する3”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、Vitis-AI ライブラリを有効化する時に CONFIG_vitis-ai-library-dbg にチェックを入れなければビルドが通った。ついでに OpenCV ライブラリも追加して、ビルドを行った。その後、sdk.sh を作成し、Petalinux 2022.1 イメージを作成した。今回は、作成した Petalinux 2022.1 イメージを balenaEtcher で MicroSD カードに書き込んで、KV260 でブートしてみたところ、途中で止まってしまった。

balenaEtcher を起動して、前回作成した petalinux-sdimage.wic を MicroSD カードに書き込んだ。
boot パーティションと root パーティションができた。
kv260_median_DPU_16_221110.png

kv260_median_DPU_17_221110.png

root パーティションの usr/include/opencv4/opencv2 ディレクトリができていた。これで Vitis で OpenCV が使えるだろう?
kv260_median_DPU_18_221110.png

MicroSD カードを KV260 に挿入して Petalinux 2022.1 をブートしたところ、

[    3.748461] irq-xilinx: /amba_pl@0/interrupt-controller@80000000: num_irq=32, sw_irq=0, edge=0x1

で止まってしまった。
kv260_median_DPU_19_221111.png

FPGAのビットストリームをロードしたのかな?
ロードしていないから、コケているのか?

起動ログを示す。

�Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kv-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1LECE1JTG
 Part Number: 5057-01  
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KV-G        
 Serial No: XFL1KO3R1GNH
 Part Number: 5066-01  
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   mmc@ff170000: 1
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr 1, interface rgmii-id
PHY reset timed out
eth0: ethernet@ff0e0000
gpio: pin gpio@ff0a000038 (gpio 38) value is 0
gpio: pin gpio@ff0a000038 (gpio 38) value is 1
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G
switch to partitions #0, OK
mmc1 is current device
Scanning mmc 1:1...
Found U-Boot script /boot.scr
2777 bytes read in 13 ms (208 KiB/s)
## Executing script at 20000000
Trying to load boot images from mmc1
22401536 bytes read in 1460 ms (14.6 MiB/s)
47649 bytes read in 19 ms (2.4 MiB/s)
23216160 bytes read in 1518 ms (14.6 MiB/s)
## Loading init Ramdisk from Legacy Image at 04000000 ...
   Image Name:   petalinux-initramfs-image-xilinx
   Created:      2011-04-05  23:00:00 UTC
   Image Type:   AArch64 Linux RAMDisk Image (uncompressed)
   Data Size:    23216096 Bytes = 22.1 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Ramdisk to 779dc000, end 78ffffe0 ... OK
   Loading Device Tree to 000000000fff1000, end 000000000ffffa20 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.19-xilinx-v2022.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP Wed Jun 15 07:44:17 UTC 2022
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] earlycon: cdns0 at MMIO 0x00000000ff010000 (options '115200n8')
[    0.000000] printk: bootconsole [cdns0] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000087fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000003ecfffff]
[    0.000000]   node   0: [mem 0x000000003ed00000-0x000000003ee47fff]
[    0.000000]   node   0: [mem 0x000000003ee48000-0x000000007fefffff]
[    0.000000]   node   0: [mem 0x0000000800000000-0x000000087fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000087fffffff]
[    0.000000] On node 0, zone Normal: 256 pages in unavailable ranges
[    0.000000] cma: Reserved 900 MiB at 0x000000003f400000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 18 pages/cpu s34776 r8192 d30760 u73728
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1031940
[    0.000000] Kernel command line: earlycon console=ttyPS1,115200 clk_ignore_unused init_fatal_sh=1 cma=900M 
[    0.000000] Unknown kernel command line parameters "init_fatal_sh=1", will be passed to user space.
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] software IO TLB: mapped [mem 0x000000007bf00000-0x000000007ff00000] (64MB)
[    0.000000] Memory: 3078456K/4193280K available (14528K kernel code, 1012K rwdata, 4060K rodata, 2176K init, 571K bss, 193224K reserved, 921600K cma-reserved)
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] random: get_random_bytes called from start_kernel+0x474/0x6d4 with crng_init=0
[    0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000000] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.008311] Console: colour dummy device 80x25
[    0.012396] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.022752] pid_max: default: 32768 minimum: 301
[    0.027502] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.034699] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.043434] rcu: Hierarchical SRCU implementation.
[    0.047503] EFI services will not be available.
[    0.051864] smp: Bringing up secondary CPUs ...
[    0.056573] Detected VIPT I-cache on CPU1
[    0.056611] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.056986] Detected VIPT I-cache on CPU2
[    0.057008] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.057345] Detected VIPT I-cache on CPU3
[    0.057366] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.057406] smp: Brought up 1 node, 4 CPUs
[    0.091692] SMP: Total of 4 processors activated.
[    0.096364] CPU features: detected: 32-bit EL0 Support
[    0.101468] CPU features: detected: CRC32 instructions
[    0.106605] CPU: All CPU(s) started at EL2
[    0.110648] alternatives: patching kernel code
[    0.116062] devtmpfs: initialized
[    0.123835] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.128033] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.160865] pinctrl core: initialized pinctrl subsystem
[    0.161343] DMI not present or invalid.
[    0.164517] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.171088] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.177238] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.185060] audit: initializing netlink subsys (disabled)
[    0.190468] audit: type=2000 audit(0.132:1): state=initialized audit_enabled=0 res=1
[    0.190810] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.204888] ASID allocator initialised with 65536 entries
[    0.210295] Serial: AMBA PL011 UART driver
[    0.233004] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.234062] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.240731] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.247387] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    1.216681] cryptd: max_cpu_qlen set to 1000
[    1.239037] DRBG: Continuing without Jitter RNG
[    1.338750] raid6: neonx8   gen()  2377 MB/s
[    1.406796] raid6: neonx8   xor()  1761 MB/s
[    1.474856] raid6: neonx4   gen()  2425 MB/s
[    1.542907] raid6: neonx4   xor()  1729 MB/s
[    1.610970] raid6: neonx2   gen()  2294 MB/s
[    1.679019] raid6: neonx2   xor()  1590 MB/s
[    1.747086] raid6: neonx1   gen()  1956 MB/s
[    1.815138] raid6: neonx1   xor()  1348 MB/s
[    1.883193] raid6: int64x8  gen()  1518 MB/s
[    1.951248] raid6: int64x8  xor()   859 MB/s
[    2.019317] raid6: int64x4  gen()  1775 MB/s
[    2.087359] raid6: int64x4  xor()   945 MB/s
[    2.155437] raid6: int64x2  gen()  1552 MB/s
[    2.223489] raid6: int64x2  xor()   834 MB/s
[    2.291559] raid6: int64x1  gen()  1148 MB/s
[    2.359613] raid6: int64x1  xor()   575 MB/s
[    2.359651] raid6: using algorithm neonx4 gen() 2425 MB/s
[    2.363603] raid6: .... xor() 1729 MB/s, rmw enabled
[    2.368534] raid6: using neon recovery algorithm
[    2.373604] iommu: Default domain type: Translated 
[    2.377965] iommu: DMA domain TLB invalidation policy: strict mode 
[    2.384392] SCSI subsystem initialized
[    2.388035] usbcore: registered new interface driver usbfs
[    2.393389] usbcore: registered new interface driver hub
[    2.398654] usbcore: registered new device driver usb
[    2.403710] mc: Linux media interface: v0.10
[    2.407909] videodev: Linux video capture interface: v2.00
[    2.413372] pps_core: LinuxPPS API ver. 1 registered
[    2.418272] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    2.427361] PTP clock support registered
[    2.431265] EDAC MC: Ver: 3.0.0
[    2.434618] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    2.443030] zynqmp-ipi-mbox mailbox@ff990600: Registered ZynqMP IPI mbox with TX/RX channels.
[    2.451423] FPGA manager framework
[    2.454779] Advanced Linux Sound Architecture Driver Initialized.
[    2.461039] Bluetooth: Core ver 2.22
[    2.464300] NET: Registered PF_BLUETOOTH protocol family
[    2.469568] Bluetooth: HCI device and connection manager initialized
[    2.475885] Bluetooth: HCI socket layer initialized
[    2.480729] Bluetooth: L2CAP socket layer initialized
[    2.485749] Bluetooth: SCO socket layer initialized
[    2.490908] clocksource: Switched to clocksource arch_sys_counter
[    2.496755] VFS: Disk quotas dquot_6.6.0
[    2.500569] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.511400] NET: Registered PF_INET protocol family
[    2.512325] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    2.520987] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    2.528079] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    2.536098] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    2.543534] TCP: Hash tables configured (established 32768 bind 32768)
[    2.549735] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    2.556393] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    2.563543] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    2.569356] RPC: Registered named UNIX socket transport module.
[    2.574936] RPC: Registered udp transport module.
[    2.579600] RPC: Registered tcp transport module.
[    2.584267] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    2.591223] PCI: CLS 0 bytes, default 64
[    2.594686] Trying to unpack rootfs image as initramfs...
[    2.600672] armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
[    2.608019] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    3.594509] Freeing initrd memory: 22668K
[    3.625380] Initialise system trusted keyrings
[    3.625506] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    3.631313] NFS: Registering the id_resolver key type
[    3.635671] Key type id_resolver registered
[    3.639760] Key type id_legacy registered
[    3.643753] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    3.650400] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    3.657764] jffs2: version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
[    3.696710] NET: Registered PF_ALG protocol family
[    3.696758] xor: measuring software checksum speed
[    3.704381]    8regs           :  2626 MB/sec
[    3.708112]    32regs          :  3110 MB/sec
[    3.713106]    arm64_neon      :  2564 MB/sec
[    3.713592] xor: using function: 32regs (3110 MB/sec)
[    3.718614] Key type asymmetric registered
[    3.722679] Asymmetric key parser 'x509' registered
[    3.727556] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 244)
[    3.734877] io scheduler mq-deadline registered
[    3.739374] io scheduler kyber registered
[    3.743631] irq-xilinx: mismatch in kind-of-intr param
[    3.748461] irq-xilinx: /amba_pl@0/interrupt-controller@80000000: num_irq=32, sw_irq=0, edge=0x1

  1. 2022年11月11日 05:02 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する3

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する2”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、Vitis-AI のレシピを Petalinux 2022.1 の project-spec/meta-user ディレクトリにコピーして、rootfsコンフィグに Vitis-AI のエントリを追加し、petalinux-config で設定を行ってから、ビルドしたらエラーが発生した。今回は、Vitis-AI ライブラリを有効化する時に CONFIG_vitis-ai-library-dbg にチェックを入れなければビルドが通った。ついでに OpenCV ライブラリも追加して、ビルドを行った。その後、sdk.sh を作成し、Petalinux 2022.1 イメージを作成した。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加してみたいと思っている。

Vitis-AI ライブラリを有効化する
petalinux-config -c rootfs
user package をクリックして

vitis-ai-library
vitis-ai-library-dev

を有効化する
kv260_median_DPU_9_221109.png

OpenCV ライブラリを追加する
Petalinux Pacage Groups -> pacakagegroup-petalinux-opencv をクリックして、

pacakagegroup-petalinux-opencv
pacakagegroup-petalinux-opencv-dev

を有効化する。
kv260_median_DPU_8_221109.png

kv260_median_DPU_10_221109.png

ビルドする
petalinux-build
成功した。どうやら dbg を選択するとエラーになってしまうようだ。
kv260_median_DPU_11_221109.png

sdk.sh を作成する
petalinux-build --sdk
kv260_median_DPU_12_221109.png

kv260_median_platform/kv260_median_plnx/images/linux ディレクトリに sdk.sh が生成された。

SD イメージの作成
petalinux-package --boot --u-boot --force
petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot,boot.scr,Image,system.dtb,system-zynqmp-sck-kv-g-revB.dtb" --disk-name "mmcblk1"

kv260_median_DPU_13_221109.png

kv260_median_DPU_14_221109.png

kv260_median_platform/kv260_median_plnx/images/linux ディレクトリに petalinux-sdimage.wic が生成された。これがブート可能なイメージなので、これを Micro SD カードに書いて KV260 をブートするそうだ。

SD イメージを作成した際のログを示す。

(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx$ petalinux-package --boot --u-boot --force
[INFO] Sourcing buildtools
INFO: Getting system flash information...
INFO: File in BOOT BIN: "/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux/pmufw.elf"
INFO: File in BOOT BIN: "/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux/system-zynqmp-sck-kv-g-revB.dtb"
INFO: File in BOOT BIN: "/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux/u-boot.elf"
INFO: Generating zynqmp binary package BOOT.BIN...


****** Xilinx Bootgen v2022.1
  **** Build date : Mar 30 2022-09:29:13
    ** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.

[WARNING]: Partition zynqmp_fsbl.elf.0 range is overlapped with partition bl31.elf.0 memory range

[INFO]   : Bootimage generated successfully

INFO: Binary is ready.
WARNING: Unable to access the TFTPBOOT folder /tftpboot!!!
WARNING: Skip file copy to TFTPBOOT folder!!!
(base) masaaki@masaaki-H110M4-M01:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx$ petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot,boot.scr,Image,system.dtb,system-zynqmp-sck-kv-g-revB.dtb" --disk-name "mmcblk1"
INFO: Sourcing build environment
INFO: Extracting rootfs, This may take time!
INFO: Creating wic image...
INFO: wic create /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/rootfs.wks --rootfs-dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/wic/rootfs --bootimg-dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux --kernel-dir /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux --outdir /tmp/tmp.jOi7D2O7qz -n /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/tmp/work/cortexa72-cortexa53-xilinx-linux/wic-tools/1.0-r0/recipe-sysroot-native 
INFO: Creating image(s)...

WARNING: bootloader config not specified, using defaults

INFO: The new image(s) can be found here:
  /tmp/tmp.jOi7D2O7qz/rootfs-202211091227-mmcblk1.direct

The following build artifacts were used to create the image(s):
  ROOTFS_DIR:                   /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/wic/rootfs
  BOOTIMG_DIR:                  /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux
  KERNEL_DIR:                   /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/images/linux
  NATIVE_SYSROOT:               /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/tmp/work/cortexa72-cortexa53-xilinx-linux/wic-tools/1.0-r0/recipe-sysroot-native

INFO: The image(s) were created using OE kickstart file:
  /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/rootfs.wks

  1. 2022年11月10日 04:09 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する2

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する1”の続き。

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたいということで、前回は、Vitis-AI を git clone した。今回は、Vitis-AI のレシピを Petalinux 2022.1 の project-spec/meta-user ディレクトリにコピーして、rootfsコンフィグに Vitis-AI のエントリを追加し、petalinux-config で設定を行ってから、ビルドしたらエラーが発生した。

参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加してみたいと思っている。

なお、kv260_median アクセラレーション・プラットフォームを作成する時に Petalinux 2022.1 でビルドしたのは、”kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる9”だ。

Vitis-AI レシピ・ディレクトリを project-spec/meta-user ディレクトリにコピーする
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx
cp -r /media/masaaki/Ubuntu_Disk/DNN/Vitis-AI/setup/petalinux/recipes-vitis-ai ./project-spec/meta-user/


user-rootfsconfig を修正する
./project-spec/meta-user/conf/user-rootfsconfig に

CONFIG_vitis-ai-library
CONFIG_vitis-ai-library-dev
CONFIG_vitis-ai-library-dbg

を追加した。
kv260_median_DPU_3_221109.png

Vitis-AI ライブラリを有効化する
petalinux-config -c rootfs
user package をクリックして

vitis-ai-library
vitis-ai-library-dev
vitis-ai-library-dbg

でスペースキーを押して有効化する。
その後、Exit -> Exit を選択して、Yes でセーブする。
kv260_median_DPU_4_221109.png

kv260_median_DPU_5_221109.png

ビルドする
petalinux-build
vitis-ai-library-2.5-r0 をコンパイルしている。
kv260_median_DPU_6_221109.png

エラーになってしまった。
kv260_median_DPU_7_221109.png

ログを示す。

v260_median_platform/kv260_median_plnx$ petalinux-build
[INFO] Sourcing buildtools
[INFO] Building project
[INFO] Sourcing build environment
[INFO] Generating workspace directory
INFO: bitbake petalinux-image-minimal
NOTE: Started PRServer with DBfile: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/cache/prserv.sqlite3, Address: 127.0.0.1:46531, PID: 23489
Loading cache: 100% |############################################| Time: 0:00:01
Loaded 6477 entries from dependency cache.
Parsing recipes: 100% |##########################################| Time: 0:00:01
Parsing of 4449 .bb files complete (4441 cached, 8 parsed). 6485 targets, 565 skipped, 1 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Initialising tasks: 100% |#######################################| Time: 0:00:08
Checking sstate mirror object availability: 100% |###############| Time: 0:00:46
Sstate summary: Wanted 1196 Local 33 Network 716 Missed 447 Current 2989 (62% match, 89% complete)
NOTE: Executing Tasks
ERROR: petalinux-image-minimal-1.0-r0 do_image_cpio: ExecutionError('/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/tmp/work/xilinx_k26_kv-xilinx-linux/petalinux-image-minimal/1.0-r0/temp/run.do_image_cpio.24145', 2, None, None)
ERROR: Logfile of failure stored in: /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/tmp/work/xilinx_k26_kv-xilinx-linux/petalinux-image-minimal/1.0-r0/temp/log.do_image_cpio.24145
Log data follows:
| DEBUG: Executing python function extend_recipe_sysroot
| NOTE: Direct dependencies are ['/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-core/glibc/ldconfig-native_2.12.1.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-core/update-rc.d/update-rc.d_0.8.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/opkg/opkg_0.4.5.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/createrepo-c/createrepo-c_0.17.4.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/rpm/rpm_4.16.1.3.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-extended/pigz/pigz_2.6.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/makedevs/makedevs_1.0.1.bb:do_populate_sysroot', '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/qemu/qemuwrapper-cross_1.0.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/dnf/dnf_4.8.0.bb:do_populate_sysroot', '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-kernel/kmod/depmodwrapper-cross_1.0.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/pseudo/pseudo_git.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-devtools/opkg-utils/opkg-utils_0.4.5.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-extended/cpio/cpio_2.13.bb:do_populate_sysroot', '/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-core/glibc/cross-localedef-native_2.34.bb:do_populate_sysroot', 'virtual:native:/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/core/meta/recipes-bsp/u-boot/u-boot-tools_2021.07.bb:do_populate_sysroot']
| NOTE: Installed into sysroot: []
| NOTE: Skipping as already exists in sysroot: ['ldconfig-native', 'update-rc.d-native', 'opkg-native', 'createrepo-c-native', 'rpm-native', 'pigz-native', 'makedevs-native', 'qemuwrapper-cross', 'dnf-native', 'depmodwrapper-cross', 'pseudo-native', 'opkg-utils-native', 'cpio-native', 'cross-localedef-native', 'u-boot-tools-native', 'shadow-native', 'systemd-systemctl-native', 'qemu-xilinx-native', 'gdk-pixbuf-native', 'gtk+3-native', 'quilt-native', 'libarchive-native', 'automake-native', 'libsolv-native', 'autoconf-native', 'pkgconfig-native', 'libtool-native', 'desktop-file-utils-native', 'python3-native', 'xz-native', 'zlib-native', 'ninja-native', 'curl-native', 'expat-native', 'sqlite3-native', 'glib-2.0-native', 'openssl-native', 'file-native', 'libxml2-native', 'cmake-native', 'bzip2-native', 'gettext-minimal-native', 'libgcrypt-native', 'popt-native', 'db-native', 'elfutils-native', 'patch-native', 'kmod-native', 'python3-iniparse-native', 'libcomps-native', 'libdnf-native', 'librepo-native', 'debianutils-native', 'perl-native', 'texinfo-dummy-native', 'flex-native', 'shared-mime-info-native', 'pmu-rom-native', 'libsdl2-native', 'dtc-native', 'libjpeg-turbo-native', 'meson-native', 'libpng-native', 'gobject-introspection-native', 'gtk-doc-native', 'pango-native', 'libxcomposite-native', 'libxdamage-native', 'libx11-native', 'libxcursor-native', 'libxext-native', 'atk-native', 'libxi-native', 'libxrandr-native', 'at-spi2-atk-native', 'libxrender-native', 'libxfixes-native', 'cairo-native', 'fontconfig-native', 'lzo-native', 'zstd-native', 'e2fsprogs-native', 'gnu-config-native', 'm4-native', 'readline-native', 'gdbm-native', 'libnsl2-native', 'libtirpc-native', 'util-linux-native', 'libffi-native', 're2c-native', 'libpcre-native', 'gettext-native', 'ncurses-native', 'libgpg-error-native', 'libcap-native', 'libmicrohttpd-native', 'attr-native', 'python3-setuptools-native', 'python3-six-native', 'libcheck-native', 'swig-native', 'json-c-native', 'libmodulemd-native', 'gpgme-native', 'perlcross-native', 'xmlto-native', 'itstool-native', 'mesa-native', 'harfbuzz-native', 'fribidi-native', 'freetype-native', 'libxft-native', 'xorgproto-native', 'util-macros-native', 'libxcb-native', 'xtrans-native', 'dbus-native', 'at-spi2-core-native', 'libsm-native', 'pixman-native', 'gperf-native', 'libcap-ng-native', 'util-linux-libuuid-native', 'libpcre2-native', 'gnutls-native', 'libyaml-native', 'libassuan-native', 'libxslt-native', 'docbook-xsl-stylesheets-native', 'docbook-xml-dtd4-native', 'xrandr-native', 'libxxf86vm-native', 'libdrm-native', 'chrpath-native', 'python3-mako-native', 'makedepend-native', 'icu-native', 'libxdmcp-native', 'libpthread-stubs-native', 'xcb-proto-native', 'libxau-native', 'libxtst-native', 'libice-native', 'libidn2-native', 'gmp-native', 'libunistring-native', 'nettle-native', 'libpciaccess-native', 'unzip-native']
| DEBUG: Python function extend_recipe_sysroot finished
| DEBUG: Executing python function set_image_size
| DEBUG: 3042031.200000 = 2340024 * 1.300000
| DEBUG: 3144431.200000 = max(3042031.200000, 65536)[3042031.200000] + 102400
| DEBUG: 3144432.000000 = int(3144431.200000)
| DEBUG: 3144432 = aligned(3144432)
| DEBUG: returning 3144432
| DEBUG: Python function set_image_size finished
| DEBUG: Executing shell function do_image_cpio
| 4328503 blocks
| cpio: cannot seek on output: Invalid argument
| WARNING: exit code 2 from a shell command.
ERROR: Task (/media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb:do_image_cpio) failed with exit code '1'
NOTE: Tasks Summary: Attempted 10444 tasks of which 10443 didn't need to be rerun and 1 failed.

Summary: 1 task failed:
  /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb:do_image_cpio
Summary: There was 1 ERROR message shown, returning a non-zero exit code.
ERROR: Failed to build project. Check the /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_plnx/build/build.log file for more details...

  1. 2022年11月09日 05:40 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加する1

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる30”で ひとまず KV260 のアクセラレーション・プラットフォーム上の回路とハードウエア・カーネルを連帯させて動作させることができた。これで、UltraScale+ MPSoC のボードで Vitis アクセラレーション・アプリケーション開発ができるようになった。
次のFPGAの部屋のブログのシリーズは、その kv260_median アクセラレーション・プラットフォームに Vitis-AI の DPU を追加してみたい。
参考にさせていただくのは、”KV260向けにVitisプラットフォームを作成してDPUを動かす その1 (Vitis 2022.1 + Vitis-AI v2.5)”で、これを元に、途中から DPU を追加してみたいと思っている。

まずは、手始めに最新の Vitis-AI を git clone する。現在の Vitis-AI のバージョンは 2.5 update2 の様だ。
なお、私のパソコンは Ubuntu 18.04 をインストールしてある。
なお現在の環境は、Vitis 2022.1 と Petalinux 2022.1 の settings64.sh と settings.sh、XRT の setup.sh を実行してある。

最新の Vitis-AI を git clone する。
git clone https://github.com/Xilinx/Vitis-AI.git
kv260_median_DPU_1_221108.png

cd Vitis-AI
git checkout 469a4b7bc7b7213d76507c34eeb258580322befd

kv260_median_DPU_2_221108.png
  1. 2022年11月08日 05:07 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる30

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる29”の続き。

前回は、system.bit から median_sobel_bmp.bit.bin を作成し、median_sobel_bmp.dtbo ファイルを用意した。更に、pl.dtsi を median_sobel_bmp.bit.bin を使用するように変更し、再度コンパイルして、pl.dtbo を作成し、名前を median_sobel_bmp.dtbo に変更した。今回は、必要なファイルを KV260 の Petalinux 2022.1 に SFTP でアップロードした。median_soble_bmp を実行できるように環境を整備して、実行したところ成功した。

KV260 の Petalinux 2022.1 の ~/kv260_median ディレクトリに median_sobel_bmp ディレクトリを作成した。
cd ~/kv260_median
mkdir median_sobel_bmp
cd median_sobel_bmp


以下のファイルを KV260 の Petalinux 2022.1 の ~/kv260_median/median_sobel_bmp ディレクトリに FileZilla でホストパソコンから転送した。

kv260_median_platform/device-tree-xlnx/median_sobel_bmp.dtbo
kv260_median_platform/kv260_median_pkg/median_sobel_bmp_system/Hardware/package.build/package/median_sobel_bmp.bit.bin
kv260_median_platform/kv260_median_pkg/pfm/shell.json
kv260_median_platform/kv260_median_pkg/median_sobel_bmp/Hardware/median_sobel_bmp
kv260_median_platform/kv260_median_pkg/median_sobel_bmp_system_hw_link/Hardware/binary_container_1.xclbin


KV260_custom_platform_241_221106.png

KV260_custom_platform_242_221106.png

KV260 の Petalinux 2022.1 上で /lib/firmware/xilinx/median_sobel_bmp を作成した。
median_sobel_bmp.dtbo median_sobel_bmp.bit.bin shell.json ファイルを /lib/firmware/xilinx/median_sobel_bmp に移動した。
sudo mkdir /lib/firmware/xilinx/median_sobel_bmp
sudo mv median_sobel_bmp.dtbo median_sobel_bmp.bit.bin shell.json /lib/firmware/xilinx/median_sobel_bmp
ls -l /lib/firmware/xilinx/median_sobel_bmp

KV260_custom_platform_243_221106.png

KV260 の Petalinux 上で、ホーム・ディレクトリに行って、 u-dma-buf をロードする。
cd
sudo insmod u-dma-buf.ko udmabuf0=3000000


すでにロードされているハードウェアをアンロードして、median_sobel_bmp をロードする。
sudo xmutil unloadapp
sudo xmutil loadapp median_sobel_bmp


~/kv260_median/median_sobel_bmp に行って、test2.bmp をコピーする。
cd ~/kv260_median/median_sobel_bmp
cp ../median_pf_bmp/test2.bmp .


median_sobel_bmp を実行したところ成功した。。。やった〜〜〜
sudo ./median_sobel_bmp binary_container_1.xclbin
KV260_custom_platform_244_221107.png

ハードウエアの実行時間は 2481620 ns つまり約 2.48 ms だった。

生成された median_filter.bmp と temp_sobel.bmp をホストパソコン上に SFTP で転送した。
KV260_custom_platform_245_221107.png

median_filter.bmp を示す。
KV260_custom_platform_246_221107.jpg

temp_sobel.bmp を示す。
KV260_custom_platform_247_221107.jpg

結構長い道のりだったが、成功して良かった。

Petalinux でハードウエアの Vivado のブロック・デザイン上の IP のデバイス・ツリーがビルドされた Petalinux 上にロードされれば、UIO を使用して、ユーザー・モードで動作するようにできると思う。これは次の課題だろう?
  1. 2022年11月07日 04:13 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる29

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる28”の続き。

前回は、Vitis 2022.1 の median_sobel_bmp アクセラレーション・アプリケーション・プロジェクトをビルドしたところ成功した。Vitis HLS のプロジェクトと Vivado のプロジェクトを確認した。今回は、system.bit から median_sobel_bmp.bit.bin を作成し、median_sobel_bmp.dtbo ファイルを用意した。更に、pl.dtsi を median_sobel_bmp.bit.bin を使用するように変更し、再度コンパイルして、pl.dtbo を作成し、名前を median_sobel_bmp.dtbo に変更した。

KV260 に転送するファイルを準備する
bin ファイルを用意する
system.bit は kv260_median_platform/kv260_median_pkg/median_sobel_bmp_system/Hardware/package.build/package にある。
KV260_custom_platform_236_221105.png

system.bit から median_sobel_bmp.bit.bin を作成する。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg/median_sobel_bmp_system/Hardware/package.build/package
echo 'all:{system.bit}'>bootgen.bif
bootgen -w -arch zynqmp -process_bitstream bin -image bootgen.bif
mv system.bit.bin median_sobel_bmp.bit.bin

KV260_custom_platform_237_221105.png

median_sobel_bmp.bit.bin が作成できた。
KV260_custom_platform_238_221105.png

median_sobel_bmp.dtbo ファイルを用意する
pl.dtsi ファイルを編集して、pl.dtbo ファイルを作成する。
pl.dtsi ファイルは kv260_median_platform/device-tree-xlnx ディレクトリにある。

pl.dtsi を開いて 16 行目の kv260_custom_platform.bit.bin を vadd.bit.bin に変更する。
KV260_custom_platform_239_221105.png

pl.dtsi をコンパイルして、pl.dtbo を作成し、名前を median_sobel_bmp.dtbo に変更した。
cd /media/masaaki/Ubuntu_Disk/KRIA_KV260/2022.1/kv260_median_platform/device-tree-xlnx
dtc -@ -O dtb -o pl.dtbo pl.dtsi
mv pl.dtbo median_sobel_bmp.dtbo

KV260_custom_platform_240_221105.png

shell.json ファイルを作成する(vadd の時に作成済みなので、省略)
kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる14”を参照
  1. 2022年11月06日 04:48 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる28

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる27”の続き。

前回は、median_sobel_bmp_host.cpp、 bmp_header.h、 sobel_filter_axim_k.cpp のソースコードを貼った。今回は、Vitis 2022.1 の median_sobel_bmp アクセラレーション・アプリケーション・プロジェクトをビルドしたところ成功した。Vitis HLS のプロジェクトと Vivado のプロジェクトを確認した。

Explorer から median_sobel_bmp_system をクリックしてトンカチ・ボタンをクリックし、ビルドを行う。
KV260_custom_platform_226_221103.png

しばらくすると、ビルドが成功した。
KV260_custom_platform_227_221103.png

Vitis HLS 2022.1 の sobel_filter_axim プロジェクトは kv260_median_platform/kv260_median_pkg/median_sobel_bmp_kernels/Hardware/build/sobel_filter_axim/sobel_filter_axim/sobel_filter_axim にある。
KV260_custom_platform_228_221104.png

Vitis HLS 2022.1 の sobel_filter_axim プロジェクトを示す。
KV260_custom_platform_229_221104.png

C コードの合成結果を示す。
KV260_custom_platform_230_221104.png
KV260_custom_platform_231_221104.png

Vivado 2022.1 の prj プロジェクトは kv260_median_platform/kv260_median_pkg/median_sobel_bmp_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj にあった。
KV260_custom_platform_232_221104.png

Vivado 2022.1 の prj プロジェクトを示す。
KV260_custom_platform_233_221104.png

system ブロック・デザインを示す。
KV260_custom_platform_234_221104.png

sobel_filter_axim_1 IP が生成されていた。

Address Editor 画面を示す。
KV260_custom_platform_235_221104.png
  1. 2022年11月04日 05:02 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる27

Viits 2022.1 のアクセラレーション・アプリケーションでカーネルを指定する方法(C の場合)”の続き。

前回は、sobel_filter_axim_k.cpp をカーネルとして指定するのだが、Vitis 2019.2 で行うカーネルの指定方法と Vitis 2022.1 のカーネル指定方法がだいぶ違っていたので、タイトルを変えて、その方法を書いておく。プロジェクトを作成する際にTemplates 画面で Empty Application を選択した場合の手順を示している。今回は、median_sobel_bmp_host.cpp、 bmp_header.h、 sobel_filter_axim_k.cpp のソースコードを貼っておく。

bmp_header.h のソースコードを貼っておく。

// bmp_header.h
// BMP ファイルフォーマットから引用させて頂きました
// http://www.kk.iij4u.or.jp/~kondo/bmp/
//
// 2017/05/04 : takseiさんのご指摘によりintX_tを使った宣言に変更。takseiさんありがとうございました
//              変数の型のサイズの違いによってLinuxの64ビット版では動作しなかったためです
//              http://marsee101.blog19.fc2.com/blog-entry-3354.html#comment2808
//

#include <stdio.h>
#include <stdint.h>

// BITMAPFILEHEADER 14bytes
typedef struct tagBITMAPFILEHEADER {
    uint16_t bfType;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;
} BITMAPFILEHEADER;

// BITMAPINFOHEADER 40bytes
typedef struct tagBITMAPINFOHEADER{
    uint32_t biSize;
    int32_t biWidth;
    int32_t biHeight;
    uint16_t biPlanes;
    uint16_t biBitCount;
    uint32_t biCompression;
    uint32_t biSizeImage;
    int32_t biXPixPerMeter;
    int32_t biYPixPerMeter;
    uint32_t biClrUsed;
    uint32_t biClrImporant;
} BITMAPINFOHEADER;

typedef struct BMP24bitsFORMAT {
    uint8_t blue;
    uint8_t green;
    uint8_t red;
} BMP24FORMAT;


sobel_filter_axim_k.cpp のソースコードを示す。

// sobel_filter_axim_k.cpp
// 2020/04/15 by marsee

#include <stdint.h>

#define HORIZONTAL  0
#define VERTICAL    1

int32_t sobel_fil(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2);
int32_t conv_rgb2y(int32_t rgb);
int32_t square_root8(int32_t val);

#define DISPLAY_WIDTH 800
#define DISPLAY_HIGHT 600

extern "C" {
void sobel_filter_axim(int32_t *cam_fb, int32_t *sobel_fb){
#pragma HLS INTERFACE m_axi depth=480000 port=sobel_fb offset=slave
#pragma HLS INTERFACE m_axi depth=480000 port=cam_fb offset=slave
#pragma HLS INTERFACE s_axilite port=return
    int32_t sobel_val, sobel_h_val, sobel_v_val;
    int32_t line_buf[2][DISPLAY_WIDTH];
#pragma HLS array_partition variable=line_buf block factor=2 dim=1
#pragma HLS resource variable=line_buf core=RAM_2P

    int32_t pix_mat[3][3];
#pragma HLS array_partition variable=pix_mat complete

    LOOP_Y: for(int y=0; y<DISPLAY_HIGHT; y++){
        LOOP_X: for(int x=0; x<DISPLAY_WIDTH; x++){
#pragma HLS PIPELINE II=1
            LOOP_PIX_MAT_K: for(int k=0; k<3; k++){
                LOOP_PIX_MAT_M: for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            int32_t y_val = conv_rgb2y(cam_fb[y*DISPLAY_WIDTH+x]);
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            sobel_h_val = sobel_fil(HORIZONTAL, pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_v_val = sobel_fil(VERTICAL,   pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_val = square_root8(sobel_h_val*sobel_h_val + sobel_v_val*sobel_v_val);

            if(x<2 || y<2)
                sobel_val = 0;

            sobel_fb[y*DISPLAY_WIDTH+x] = (sobel_val<<16)+(sobel_val<<8)+sobel_val;
        }
    }
}
}

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int32_t conv_rgb2y(int32_t rgb){
    int32_t r, g, b, y_f;
    int32_t y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// sobel filter
// HORZONTAL
// x0y0 x1y0 x2y0  1  2  1
// x0y1 x1y1 x2y1  0  0  0
// x0y2 x1y2 x2y2 -1 -2 -1
// VERTICAL
// x0y0 x1y0 x2y0  1  0 -1
// x0y1 x1y1 x2y1  2  0 -2
// x0y2 x1y2 x2y2  1  0 -1
int32_t sobel_fil(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2){
    int32_t y;

    if(h_or_v == HORIZONTAL){
        y = x0y0 + 2*x1y0 + x2y0 - x0y2 - 2*x1y2 - x2y2;
    } else {
        y = x0y0 - x2y0 + 2*x0y1 - 2*x2y1 + x0y2 - x2y2;
    }
    if(y<0)
        y = -y;
        //y = 0;
    else if(y>255)
        y = 255;
    return(y);
}

// square_root8
// 8bit幅のsquare_rootを求める
int32_t square_root8(int32_t val){
    int32_t temp = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }

    return(temp);
}


median_sobel_bmp_host.cpp のソースコードを示す。

// median_sobel_bmp_host.cpp
// 2022/10/31 by marsee
// 2022/11/07 : bug fixed

// Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/host/host_step1.cpp のコードを引用します
// https://github.com/Xilinx/Vitis-Tutorials/blob/master/docs/mixing-c-rtl-kernels/reference-files/src/host/host_step1.cpp

#define CL_HPP_CL_1_2_DEFAULT_BUILD
#define CL_HPP_TARGET_OPENCL_VERSION 120
#define CL_HPP_MINIMUM_OPENCL_VERSION 120
#define CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY 1
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS

#define BLOCK_SIZE    4096
#define MIDEAIN_REG_ADDR        0x80020000
#define AXI_DMA_REG_ADDR        0x80010000
#define IMAGE_WIDTH         800
#define IMAGE_HEIGHT            600
#define IMAGE_CHANNEL       3
#define MAT_IMGAGE_BUF      (IMAGE_WIDTH*IMAGE_HEIGHT*IMAGE_CHANNEL)

#define MM2S_CONTROL_REG    0x00
#define MM2S_STATUS_REG (0x4 >> 2)
#define MM2S_START_ADDR (0x18 >> 2)
#define MM2S_LENGTH_REG (0x28 >> 2)
#define S2MM_CONTROL_REG    (0x30 >> 2)
#define S2MM_STATUS_REG (0x34 >> 2)
#define S2MM_DESTINATION_ADDR   (0x48 >> 2)
#define S2MM_LENGTH_REG (0x58 >> 2)
// bits 1 - idle
#define MM2S_IDLE_MASK  0x2
#define S2MM_IDLE_MASK  0x2

#define MEDIAN_CONTROL      0x00
#define MEDIAN_FUNCTION_R   (0x18 >> 2)
#define MEDIAN_ROW_SIZE     (0x20 >> 2)
#define MEDIAN_COL_SIZE     (0x28 >> 2)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <CL/cl2.hpp>
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <limits.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>

#include "bmp_header.h"

int sobel_fil_soft(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2);
int32_t conv_rgb2y_soft(int32_t rgb);
int32_t square_root8_soft(int32_t val);
void sobel_filter_axim_soft(int32_t *cam_fb, int32_t *sobel_fb);

static const std::string error_message =
    "Error: Result mismatch:\n"
    "i = %d CPU result = %d Device result = %d\n";

//Some Library functions to be used.
template <typename T>
struct aligned_allocator
{
  using value_type = T;
  T* allocate(std::size_t num)
  {
    void* ptr = nullptr;
    if (posix_memalign(&ptr,4096,num*sizeof(T)))
      throw std::bad_alloc();
    return reinterpret_cast<T*>(ptr);
  }
  void deallocate(T* p, std::size_t num)
  {
    free(p);
  }
};


#define OCL_CHECK(error,call)                                       \
    call;                                                           \
    if (error != CL_SUCCESS) {                                      \
      printf("%s:%d Error calling " #call ", error code is: %d\n",  \
              __FILE__,__LINE__, error);                            \
      exit(EXIT_FAILURE);                                           \
    }

namespace xcl {
std::vector<cl::Device> get_devices(const std::string& vendor_name) {

    size_t i;
    cl_int err;
    std::vector<cl::Platform> platforms;
    OCL_CHECK(err, err = cl::Platform::get(&platforms));
    cl::Platform platform;
    for (i  = 0 ; i < platforms.size(); i++){
        platform = platforms[i];
        OCL_CHECK(err, std::string platformName = platform.getInfo<CL_PLATFORM_NAME>(&err));
        if (platformName == vendor_name){
            std::cout << "Found Platform" << std::endl;
            std::cout << "Platform Name: " << platformName.c_str() << std::endl;
            break;
        }
    }
    if (i == platforms.size()) {
        std::cout << "Error: Failed to find Xilinx platform" << std::endl;
        exit(EXIT_FAILURE);
    }

    //Getting ACCELERATOR Devices and selecting 1st such device
    std::vector<cl::Device> devices;
    OCL_CHECK(err, err = platform.getDevices(CL_DEVICE_TYPE_ACCELERATOR, &devices));
    return devices;
}

std::vector<cl::Device> get_xil_devices() {
    return get_devices("Xilinx");
}

char* read_binary_file(const std::string &xclbin_file_name, unsigned &nb)
{
    std::cout << "INFO: Reading " << xclbin_file_name << std::endl;

    if(access(xclbin_file_name.c_str(), R_OK) != 0) {
        printf("ERROR: %s xclbin not available please build\n", xclbin_file_name.c_str());
        exit(EXIT_FAILURE);
    }
    //Loading XCL Bin into char buffer
    std::cout << "Loading: '" << xclbin_file_name.c_str() << "'\n";
    std::ifstream bin_file(xclbin_file_name.c_str(), std::ifstream::binary);
    bin_file.seekg (0, bin_file.end);
    nb = bin_file.tellg();
    bin_file.seekg (0, bin_file.beg);
    char *buf = new char [nb];
    bin_file.read(buf, nb);
    return buf;
}
};

int main(int argc, char* argv[])
{
    long x, y;
    BITMAPFILEHEADER bmpfhr; // BMPファイルのファイルヘッダ(for Read)
    BITMAPINFOHEADER bmpihr; // BMPファイルのINFOヘッダ(for Read)
    FILE *fbmpr, *fbmpw;
    int32_t blue, green, red;
    const char* xclbinFilename;
    int fd;
    volatile uint32_t *median_reg, *axi_dma_reg;
    volatile uint8_t *pict_buf;
    int fd_udmabuf;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;

    if (argc==2) {
        xclbinFilename = argv[1];
        std::cout <<"Using FPGA binary file specfied through the command line: " << xclbinFilename << std::endl;
    }
    else {
        xclbinFilename = "../sobel_filter_axim.xclbin";
        std::cout << "No FPGA binary file specified through the command line, using:" << xclbinFilename <<std::endl;
    }

    if ((fbmpr = fopen("test2.bmp", "rb")) == NULL){ // test.bmp をオープン
        fprintf(stderr, "Can't open test2.bmp by binary read mode\n");
        exit(1);
    }
    // bmpヘッダの読み出し
    fread(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpr);

    // ピクセルを入れるメモリをアロケートする
    std::vector<int32_t,aligned_allocator<int32_t>> rd_bmp(bmpihr.biWidth * bmpihr.biHeight);
    std::vector<int32_t,aligned_allocator<int32_t>> hw_sobel(bmpihr.biWidth * bmpihr.biHeight);
    std::vector<int32_t,aligned_allocator<int32_t>> sw_sobel(bmpihr.biWidth * bmpihr.biHeight);

    int size_in_words = bmpihr.biWidth * bmpihr.biHeight;
    int size_in_bytes = size_in_words * IMAGE_CHANNEL;
    int size_in_uint32 = size_in_words * sizeof(uint32_t);

    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }

    // median_filter registers
    median_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, MIDEAIN_REG_ADDR );
    if ((int64_t)median_reg == -1){
        fprintf(stderr,"/dev/mem map error for median_filter registers\n");
        exit(-1);
    }

    // axi_dma registers
    axi_dma_reg = (uint32_t *)mmap(NULL, BLOCK_SIZE,
                PROT_READ | PROT_WRITE, MAP_SHARED,
                fd, AXI_DMA_REG_ADDR );
    if ((int64_t)axi_dma_reg == -1){
        fprintf(stderr,"/dev/mem map error for axi_dma registers\n");
        exit(-1);
    }

    // udmabuf0
    fd_udmabuf = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled.
    if (fd_udmabuf == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);

    pict_buf = (volatile uint8_t *)mmap(NULL, size_in_bytes*2, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf, 0);
    if (pict_buf == MAP_FAILED){
        fprintf(stderr, "org_mat mmap error\n");
        exit(-1);
    }
    volatile uint8_t *median = &pict_buf[size_in_bytes];

    // pict_bufに画像イメージを書き込む
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            blue = fgetc(fbmpr);
            green = fgetc(fbmpr);
            red = fgetc(fbmpr);
            uint32_t index = (((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x)*IMAGE_CHANNEL;
            pict_buf[index] = blue;
            pict_buf[index+1] = green;
            pict_buf[index+2] = red;
        }
    }
    fclose(fbmpr);

    // Halting Run DMA
    axi_dma_reg[MM2S_CONTROL_REG] = 1; // MM2S DMA Controll Reg. Run
    axi_dma_reg[S2MM_CONTROL_REG] = 1; // S2MM DMA Control Reg. Run

    uint32_t median_mat_addr = (uint32_t)phys_addr+size_in_bytes;
    uint32_t org_mat_addr = (uint32_t)phys_addr;
    // axi dma settings
    axi_dma_reg[S2MM_DESTINATION_ADDR] = median_mat_addr;
    axi_dma_reg[MM2S_START_ADDR] = org_mat_addr;
    axi_dma_reg[S2MM_LENGTH_REG] = size_in_bytes;
    axi_dma_reg[MM2S_LENGTH_REG] = size_in_bytes;

    // median filter start
    median_reg[MEDIAN_COL_SIZE] = bmpihr.biWidth;
    median_reg[MEDIAN_ROW_SIZE] = bmpihr.biHeight;
    median_reg[MEDIAN_FUNCTION_R] = 3;  // median filter for AXI DMA
    median_reg[MEDIAN_CONTROL] = 1;         // ap_start

    // DMA completion detection
    uint32_t mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    while(mm2s_status_reg != MM2S_IDLE_MASK){
        mm2s_status_reg = axi_dma_reg[MM2S_STATUS_REG] & MM2S_IDLE_MASK;
    }

    uint32_t s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    while(s2mm_status_reg != S2MM_IDLE_MASK){
        s2mm_status_reg = axi_dma_reg[S2MM_STATUS_REG] & S2MM_IDLE_MASK;
    }

    // Write to median_filter.bmp
    // ハードウェアのソーベルフィルタの結果を median_filter.bmp へ出力する
    if ((fbmpw=fopen("median_filter.bmp", "wb")) == NULL){
        fprintf(stderr, "Can't open median_filter.bmp by binary write mode\n");
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpw);

    // RGB データの書き込み、逆順にする
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            uint32_t index = (((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x)*IMAGE_CHANNEL;
            blue = median[index];
            green = median[index+1];
            red = median[index+2];

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);

    // rd_buf にメディアン・フィルタ処理後のデータを保存する
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            uint32_t index = (y*bmpihr.biWidth+x)*IMAGE_CHANNEL;
            rd_bmp[y*bmpihr.biWidth+x] = (median[index+2]<<16) + (median[index+1]<<8) + median[index];
        }
    }

    std::vector<cl::Device> devices = xcl::get_xil_devices();
    cl::Device device = devices[0];
    devices.resize(1);


    // Creating Context and Command Queue for selected device
    cl::Context context(device);
    cl::CommandQueue q(context, device, CL_QUEUE_PROFILING_ENABLE);

    // Load xclbin
    std::cout << "Loading: '" << xclbinFilename << "'\n";
    std::ifstream bin_file(xclbinFilename, std::ifstream::binary);
    bin_file.seekg (0, bin_file.end);
    unsigned nb = bin_file.tellg();
    bin_file.seekg (0, bin_file.beg);
    char *buf = new char [nb];
    bin_file.read(buf, nb);

    // Creating Program from Binary File
    cl::Program::Binaries bins;
    bins.push_back({buf,nb});
    cl::Program program(context, devices, bins);

    // This call will get the kernel object from program. A kernel is an
    // OpenCL function that is executed on the FPGA.
    cl::Kernel krnl_sobel_filter(program,"sobel_filter_axim");

    // These commands will allocate memory on the Device. The cl::Buffer objects can
    // be used to reference the memory locations on the device.
    cl::Buffer rd_bmp_buf(context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY,
            size_in_uint32, rd_bmp.data());
    cl::Buffer hw_sobel_buf(context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE,
            size_in_uint32, hw_sobel.data());

    // Data will be transferred from system memory over PCIe to the FPGA on-board
    // DDR memory.
    q.enqueueMigrateMemObjects({rd_bmp_buf},0/* 0 means from host*/);

    //set the kernel Arguments
    krnl_sobel_filter.setArg(0,rd_bmp_buf);
    krnl_sobel_filter.setArg(1,hw_sobel_buf);

    cl::Event event;
    uint64_t sobel_f_start, sobel_f_end;

    //Launch the Kernel
    q.enqueueTask(krnl_sobel_filter, NULL, &event);

    // The result of the previous kernel execution will need to be retrieved in
    // order to view the results. This call will transfer the data from FPGA to
    // source_results vector

    q.enqueueMigrateMemObjects({hw_sobel_buf},CL_MIGRATE_MEM_OBJECT_HOST);

    q.finish();

    // 時間計測
    event.getProfilingInfo<uint64_t>(CL_PROFILING_COMMAND_START, &sobel_f_start);
    event.getProfilingInfo<uint64_t>(CL_PROFILING_COMMAND_END, &sobel_f_end);
    auto sobel_f_time = sobel_f_end - sobel_f_start;
    printf("sobel_filter_axim: %lu ns\n", sobel_f_time);

    // ソフトウェアとハードウェアのチェック
    sobel_filter_axim_soft((int32_t *)&rd_bmp[0], (int32_t *)&sw_sobel[0]); // ソフトウェアのソーベル・フィルタ

    // ハードウェアとソフトウェアのソーベル・フィルタの値のチェック
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            if (hw_sobel[y*bmpihr.biWidth+x] != sw_sobel[y*bmpihr.biWidth+x]){
                printf("ERROR HW and SW results mismatch x = %ld, y = %ld, HW = %d, SW = %d\n", x, y, int(hw_sobel[y*bmpihr.biWidth+x]), int(sw_sobel[y*bmpihr.biWidth+x]));
                //return(1);
            }
        }
    }
    printf("Success HW and SW results match\n");

    // ハードウェアのソーベルフィルタの結果を temp_sobel.bmp へ出力する
    if ((fbmpw=fopen("temp_sobel.bmp", "wb")) == NULL){
        fprintf(stderr, "Can't open temp_sobel.bmp by binary write mode\n");
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpw);

    // RGB データの書き込み、逆順にする
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            uint32_t index = (((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x);
            uint32_t pixel = hw_sobel[index];
            blue = pixel & 0xff;
            green = (pixel>>8) & 0xff;
            red = (pixel>>16) & 0xff;

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);

    return(0);
}

#define HORIZONTAL  0
#define VERTICAL    1

void sobel_filter_axim_soft(int32_t *cam_fb, int32_t *sobel_fb){
    int32_t sobel_val, sobel_h_val, sobel_v_val;
    int32_t line_buf[2][IMAGE_WIDTH];
    int32_t pix_mat[3][3];

    for(int y=0; y<IMAGE_HEIGHT; y++){
        for(int x=0; x<IMAGE_WIDTH; x++){
            for(int k=0; k<3; k++){
                for(int m=0; m<2; m++){
                    pix_mat[k][m] = pix_mat[k][m+1];
                }
            }
            pix_mat[0][2] = line_buf[0][x];
            pix_mat[1][2] = line_buf[1][x];
            int32_t y_val = conv_rgb2y_soft(cam_fb[y*IMAGE_WIDTH+x]);
            pix_mat[2][2] = y_val;

            line_buf[0][x] = line_buf[1][x];    // 行の入れ替え
            line_buf[1][x] = y_val;

            sobel_h_val = sobel_fil_soft(HORIZONTAL, pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_v_val = sobel_fil_soft(VERTICAL,   pix_mat[0][0], pix_mat[0][1], pix_mat[0][2],
                                                pix_mat[1][0], pix_mat[1][1], pix_mat[1][2],
                                                pix_mat[2][0], pix_mat[2][1], pix_mat[2][2]);
            sobel_val = square_root8_soft(sobel_h_val*sobel_h_val + sobel_v_val*sobel_v_val);

            if(x<2 || y<2)
                sobel_val = 0;

            sobel_fb[y*IMAGE_WIDTH+x] = (sobel_val<<16)+(sobel_val<<8)+sobel_val;
        }
    }
}

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int32_t conv_rgb2y_soft(int32_t rgb){
    int32_t r, g, b, y_f;
    int32_t y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// sobel filter
// HORZONTAL
// x0y0 x1y0 x2y0  1  2  1
// x0y1 x1y1 x2y1  0  0  0
// x0y2 x1y2 x2y2 -1 -2 -1
// VERTICAL
// x0y0 x1y0 x2y0  1  0 -1
// x0y1 x1y1 x2y1  2  0 -2
// x0y2 x1y2 x2y2  1  0 -1
int32_t sobel_fil_soft(int32_t h_or_v, int32_t x0y0, int32_t x1y0, int32_t x2y0, int32_t x0y1,
        int32_t x1y1, int32_t x2y1, int32_t x0y2, int32_t x1y2, int32_t x2y2){
    int32_t y;

    if(h_or_v == HORIZONTAL){
        y = x0y0 + 2*x1y0 + x2y0 - x0y2 - 2*x1y2 - x2y2;
    } else {
        y = x0y0 - x2y0 + 2*x0y1 - 2*x2y1 + x0y2 - x2y2;
    }
    if(y<0)
        y = -y;
        //y = 0;
    else if(y>255)
        y = 255;
    return(y);
}

// square_root8
// 8bit幅のsquare_rootを求める
int32_t square_root8_soft(int32_t val){
    int32_t temp = 0;
    int32_t square;

    for(int i=7; i>=0; --i){
        temp += (1 << i);
        square = temp * temp;

        if(square > val){
            temp -= (1 << i);
        }
    }

    return(temp);
}

  1. 2022年11月03日 04:25 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Viits 2022.1 のアクセラレーション・アプリケーションでカーネルを指定する方法(C の場合)

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる26”の続き。

前回は、ハードウエア・プラットフォームのメディアン・フィルタを使用して、画像のノイズを除去してから、アクセラレーション・アプリケーションとしてソーベル・フィルタを実装して、エッジを検出するシステムを Vitis アクセラレーション・アプリケーションとして作成した。その際に、Templates 画面で Empty Application を選択した。今回は、sobel_filter_axim_k.cpp をカーネルとして指定するのだが、Vitis 2019.2 で行うカーネルの指定方法と Vitis 2022.1 のカーネル指定方法がだいぶ違っていたので、タイトルを変えて、その方法を書いておく。プロジェクトを作成する際にTemplates 画面で Empty Application を選択した場合の手順を示している。

median_sobel_bmp アクセラレーション・アプリケーション・プロジェクトを作成した際に、median_sobel_bmp_kernels と median_sobel_bmp_hw_link ディレクトリもできた。
KV260_custom_platform_222_221103.png

median_sobel_bmp_kernels ディレクトリの median_sobel_bmp_kernels.prj を開いて、Add Hardware Function... ボタンをクリックする。
KV260_custom_platform_223_221103.png

Add Hardware Functions ダイアログが開いた。
sobel_filter_axim() を選択する。
OK ボタンをクリックした。
KV260_custom_platform_224_221103.png

Hardware Funcitons に sobel_filter_axim が入った。
Active build configuration を Hardware に変更した。
KV260_custom_platform_225_221103.png

  1. 2022年11月03日 04:14 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる26

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる25”の続き。

前回は、ハードウエア・プラットフォームのメディアン・フィルタを使用して、画像のノイズを除去してから、アクセラレーション・アプリケーションとしてソーベル・フィルタを実装して、エッジを検出するシステムを Vitis アクセラレーション・アプリケーションとして作成する。そのために Vitis 2022.1 で median_sobel_bmp プロジェクトを作成したが、Templates 画面で Empty Application (C++) を選択したため、こちらで用意したアプリケーション・ソフトウエアがうまくコンパイルでなかったので、このプロジェクトは廃棄した。今回は、ハードウエア・プラットフォームのメディアン・フィルタを使用して、画像のノイズを除去してから、アクセラレーション・アプリケーションとしてソーベル・フィルタを実装して、エッジを検出するシステムを Vitis アクセラレーション・アプリケーションとして作成した。その際に、Templates 画面で Empty Application を選択した。

kv260_median アクセラレーション・プラットフォームを使用して、median_sobel_bmp アプリケーション・プロジェクトを作成する。
Vitis 2022.1 を起動して、ワークスペースを KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg に設定した。

File メニューから New -> Application Project... を選択した。

Platform 画面
kv260_median プラットフォームを選択する。

Application Project Detail 画面
Application project name に median_sobel_bmp と入力する。

Domain 画面
sysroot path: に kv260_median_platform/kv260_median_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
Root FS: に kv260_median_platform/kv260_median_plnx/images/linux/rootfs.ext4 を指定した。
Kernel Image: に kv260_median_platform/kv260_median_plnx/images/linux/Image を指定した。

Templates 画面
Empty Application を選択した。
Finish ボタンをクリックした。

median_sobel_bmp アプリケーション・プロジェクトが生成された。

Vitis 2022.1 の median_sobel_bmp_system -> median_sobel_bmp -> src を右クリックし、右クリックメニューから New -> File を選択する。
Create New File ダイアログで File name: に median_sobel_bmp_host.cpp を入力する。

bmp_header.h を同様に追加する。

カーネルの sobel_filter_axim_k.cpp を median_sobel_bmp_system -> median_sobel_bmp_kernels -> src に追加した。
KV260_custom_platform_222_221103.png
  1. 2022年11月03日 03:59 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

Viits 2022.1 のアクセラレーション・アプリケーションでカーネルを指定する方法(C++ の場合)

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる25”の続き。

前回は、ハードウエア・プラットフォームのメディアン・フィルタを使用して、画像のノイズを除去してから、アクセラレーション・アプリケーションとしてソーベル・フィルタを実装して、エッジを検出するシステムを Vitis アクセラレーション・アプリケーションとして作成する。そのために Vitis 2022.1 で median_sobel_bmp プロジェクトを作成した。今回は、sobel_filter_axim_k.cpp をカーネルとして指定するのだが、Vitis 2019.2 で行うカーネルの指定方法と Vitis 2022.1 のカーネル指定方法がだいぶ違っていたので、タイトルを変えて、その方法を書いておく。プロジェクトを作成する際に
Templates 画面で Empty Application (C++) を選択した場合の手順を示している。

Vitis 2019.2 のアクセラレーション・アプリケーションでのカーネルとして指定する方法は、”Vitis 2019.2 のアプリケーション・プロジェクトの作り方1”に書いてある。

それは、

左上のExplorer 画面の vitis_ctut_system -> vitis_ctut の vitis_ctut.prj をクリックする。
Application Project Settings 画面が表示される。
Add Hardware Functions... ボタンをクリックする。
Vitis_tub_11_191208.png


という方法だった。
.prj ファイルに機能が集約されていた。
Vitis 2022.1 の median_sobel_bmp.prj を示す。
KV260_custom_platform_212_221101.png

Hardware Functions などは無くなっている。

それでは、何処でカーネルを設定するかと言うと .sprj ファイルになったようだ。
vadd の vadd.sprj ファイルを見てみた。
KV260_custom_platform_213_221101.png

pl ドメインの vadd_kernels と pl ドメインの vadd_system_hw_link アプリケーション・プロジェクトが追加されている。

median_sobel_bmp アクセラレーション・アプリケーションでも同様にカーネル・プロジェクトと hw_link プロジェクトを追加してみよう。
median_sobel_bmp_system.sprj を見た。
Active build configuration を Hardware にした。
Application Project の + ボタンの横の下向き三角をクリックする。
New hw kernel project... を選択する。
KV260_custom_platform_214_221101.png

Hw Kernel project name に sobel_kernels と入力した。
KV260_custom_platform_215_221101.png

sobel_kernels と median_sobel_bmp_system_hw_link プロジェクトが生成された。
KV260_custom_platform_216_221101.png

sobel_kernels -> src で 右クリックし右クリックメニューから Import Sources... を選択した。
Import Sources ダイアログが表示された。
median_sobel_bmp/src を指定して、sobel_filter_axim_k.cpp を選択した。
KV260_custom_platform_217_221101.png

sobel_kernels -> src に sobel_filter_axim_k.cpp が追加された。
KV260_custom_platform_218_221101.png

(2022/11/02:追記)
カーネル関数の指定
median_sobel_bmp_system -> median_sobel_bmp -> sobel_kernels の sobel_kernels.prj をクリックして開く。

Hardware Funtions で Add Hardware Funtion... ボタンをクリックしてハードウエア化する関数を選択する。
KV260_custom_platform_219_221102.png

Add Hardware Functions ダイアログが表示された。
sobel_filter_axim() を選択して、OK ボタンをクリックする。
KV260_custom_platform_220_221102.png

Hardware Funtions に sobel_filter_axim が入った。
KV260_custom_platform_221_221102.png
  1. 2022年11月01日 04:49 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる25

kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる24”の続き。

(2022/11/03:追記)
Templates 画面で Empty Application (C++) を選択したため、こちらで用意したアプリケーション・ソフトウエアがうまくコンパイルでなかったので、このプロジェクトは廃棄した。書き直した記事は”kv260_median_platform のメディアン・フィルタを KV260 の Petalinux から動作させる26

前回は、Vitis で前回のソフトウエアを動かそうとしたが、OpenCV ライブラリが使用できなかったので、BMP ファイルを扱うようにソフトウエアを変更した。Vitis で median_pf_bmp アプリケーション・プロジェクトを作成し、アプリケーション・ソフトウエアを書いて、ビルドを行った。ビルドが成功したので、できあがった median_pf_bmp.elf ファイルを Petalinux 2022.1 が起動する KV260 にアップロードし、動作させたところ成功した。今回は、ハードウエア・プラットフォームのメディアン・フィルタを使用して、画像のノイズを除去してから、アクセラレーション・アプリケーションとしてソーベル・フィルタを実装して、エッジを検出するシステムを Vitis アクセラレーション・アプリケーションとして作成する。そのために Vitis 2022.1 で median_sobel_bmp プロジェクトを作成する。

median_pf アクセラレーション・プラットフォームを使用して、median_pf_bmp アプリケーション・プロジェクトを作成する。
Vitis 2022.1 を起動して、ワークスペースを KRIA_KV260/2022.1/kv260_median_platform/kv260_median_pkg に設定した。

File メニューから New -> Application Project... を選択した。

Platform 画面
kv260_median プラットフォームを選択する。

Application Project Detail 画面
Application project name に median_sobel_bmp と入力する。

Domain 画面
sysroot path: に kv260_median_platform/kv260_median_pkg/sysroots/cortexa72-cortexa53-xilinx-linux を指定した。
Root FS: に kv260_median_platform/kv260_median_plnx/images/linux/rootfs.ext4 を指定した。
Kernel Image: に kv260_median_platform/kv260_median_plnx/images/linux/Image を指定した。

Templates 画面
Empty Application (C++) を選択した。
Finish ボタンをクリックした。

median_sobel_bmp アプリケーション・プロジェクトが生成された。

Vitis 2022.1 の median_pf_bmp_system -> median_pf_bmp -> src を右クリックし、右クリックメニューから New -> File を選択する。
Create New File ダイアログで File name: に median_sobel_bmp.cpp を入力する。

bmp_header.h を同様に追加する。

ホストのアプリケーション・ソフトウエアの median_sobel_bmp_host.cpp とカーネルの sobel_filter_axim_k.cpp を追加した。
KV260_custom_platform_212_221101.png
  1. 2022年11月01日 04:15 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0