FC2カウンター FPGAの部屋 Vivado HLS の浮動小数点型を使用した内積の計算

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

FPGAの部屋

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

Vivado HLS の浮動小数点型を使用した内積の計算

Vivado HLS の任意精度固定小数点型を使用した内積の計算”のおまけ。

任意精度固定小数点型の比較のために作った浮動小数点数の内積の計算だが、思ったより使用リソースが少なかったので、書いておくことにした。

まずはnn_test_float プロジェクトを示す。
ap_fixed_dot_8_170601.png

次にソースコードを示す。
まずは、nn_test_float.h から示す。

// nn_test_float.h
// 2017/05/31 by marsee
//

#ifndef __NN_TEST_H__
#define __NN_TEST_H__

#include <ap_fixed.h>

const float wt[3][4]={
    {-0.10.2, -0.30.4},
    {-0.50.6, -0.70.8},
    {-0.20.4, -0.50.6}
};

const float b[4] ={
    -0.10.4, -0.30.5
};

#endif


nn_test.cpp を示す。

// nn_test_float.cpp
// 2017/05/29 by marsee
//

#include <stdio.h>
#include "nn_test_float.h"

int nn_test(float in[3], float out[4]){
    float dot[4];

    Loop1: for(int j=0; j<4; j++){
        dot[j] = 0;
        Loop2: for(int i=0; i<3; i++){
            dot[j] += in[i]*wt[i][j];
        }
        dot[j] += b[j];
        out[j] = dot[j];
    }

    return(0);
}


nn_test_tb_float.cpp を示す。

// nn_test_tb_float.cpp
// 2017/05/29 by marsee
//

#include <stdio.h>
#include "nn_test_float.h"

int nn_test(float in[3], float out[4]);
int nn_test_soft(float in[3], float out[4]);

int main(){
    float in[3] = {0.3906250.58593750.78125};
    float out[4];
    float out_soft[4];

    nn_test(in, out);
    nn_test_soft(in, out_soft);

    for(int i=0; i<4; i++){
        if(out[i] != out_soft[i]){
            printf("ERROR HW and SW results mismatch i = %d, HW = %f, SW = %f\n", i, (float)out[i], (float)out_soft[i]);
        }else{
            printf("out[%d] = %f\n", i, (float)out[i]);
        }
    }

    return(0);
}

int nn_test_soft(float in[3], float out[4]){
    float dot[4];

    for(int j=0; j<4; j++){
        dot[j] = 0;
        for(int i=0; i<3; i++){
            dot[j] += in[i]*wt[i][j];
        }
        dot[j] += b[j];
        out[j] = dot[j];
    }

    return(0);
}


C シミュレーションは、前回の”Vivado HLS の任意精度固定小数点型を使用した内積の計算”を参照のこと。

C コードの合成を行った。
ap_fixed_dot_9_170601.png

DSPを5個使っている以外は案外、リソース使用量が少ないのではないだろうか?

Analysis 画面を開いた。DSP は浮動小数点数の乗算に3個、加算の2個使用されている。
ap_fixed_dot_10_170601.png

C/RTL協調シミュレーションを行った。やはり、前回の 109 クロックよりも完了までのクロック数は増えている。
ap_fixed_dot_11_170601.png

C/RTL協調シミュレーションの出力も問題なさそうだ。

out[0] = -0.588281
out[1] = 1.142187
out[2] = -1.217969
out[3] = 1.593750


C/RTL協調シミュレーション結果を示す。
ap_fixed_dot_12_170601.png

浮動小数点数が出ているようだ。
  1. 2017年06月01日 21:17 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3815-5935f90b
この記事にトラックバックする(FC2ブログユーザー)