FC2カウンター FPGAの部屋 2017年05月29日
FC2ブログ

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

FPGAの部屋

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

Vivado HLS の符号付 C++の任意精度固定小数点型について

Vivado HLS の符号付 C++の任意精度固定小数点型について疑問があったので調べてみた。
Vivado HLS の C++の任意精度固定小数点型は、C++のテンプレートを使用して、ap_[u]fixed で宣言される。(Xilinx社のUser Guide 高位合成 UG902 (v2016.4) 2016年11月30日 192 ページ「C++ の任意精度固定小数点型」参照)

W :ワード長(ビット数)
I :整数部のビット長
Q :量子化モード
O :オーバーフローモード
N :折り返しモードでの飽和ビット数


符号なしC++の任意精度固定小数点型 ap_ufixed<> は問題ないが、符号付C++の任意精度固定小数点型 ap_fixed<>で整数部を1ビットにした場合は符号ビットを含むのか含まないのか?が疑問だった。
そこで、Vivado HLS 2017.1 で ap_fixed_test プロジェクトを作成して、テストしてみた。
ap_fixed_test プロジェクトを示す。
ap_fixed_test_1_170529.png

テストベンチの ap_fixed_test_tb.cpp を示す。

// ap_fixed_test_tb.cpp
// 2017/04/29
//

#include <stdio.h>
#include <ap_fixed.h>

int main(){
    ap_fixed<91, AP_TRN_ZERO, AP_SAT> a;
    float f;

    a = 0.5;
    f = a;
    printf("0.5: %f\n", f);
    a = 1.0;
    f = a;
    printf("1.0: %f\n", f);
    a = -1.0;
    f = a;
    printf("-1.0: %f\n", f);
    a = -0.5;
    f = a;
    printf("-0.5: %f\n", f);
    a = 2.0;
    f = a;
    printf("2.0: %f\n", f);
    a = -1.5;
    f = a;
    printf("-1.5: %f\n", f);
    a = -0.9;
    f = a;
    printf("-0.9: %f\n", f);
}


このテストベンチのC シミュレーション結果はすでにVivado HLS のプロジェクトの図に表示されているが、下に示す。

0.5: 0.500000
1.0: 0.996094
-1.0: -1.000000
-0.5: -0.500000
2.0: 0.996094
-1.5: -1.000000
-0.9: -0.898438


この結果から、整数部のビット長を 1 とすると、1.0 - 量子化ステップ値 ~ -1.0 までの値を取れるようだ。つまり整数部は符号を表すビットのみの 1 ビットだけということになる。
  1. 2017年05月29日 15:05 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

BNN-PYNQ のトレーニングを試してみる2

BNN-PYNQ のトレーニングを試してみる1”の続き。

前回は、Theano やpylearn2 をインストールして、mnist のトレーニングを行った。33時間20分かかってトレーニングが終了した。
今回は、その結果を見ていこう。

~/BNN-PYNQ/bnn/src/training ディレクトリに mnist_parameters.npz ができていた。

トレーニングされたmnist の重みをバイナリにしてみよう。
python mnist-gen-binary-weights.py
を実行した。
BNN-PYNQ_58_170528.png
BNN-PYNQ_59_170528.png

表示出力の全文を示す。

masaaki@masaaki-VirtualBox2:~/BNN-PYNQ/bnn/src/training$ python mnist-gen-binary-weights.py
Extracting FCBN complex, ins = 784 outs = 1024
Layer 0: 1024 x 832, SIMD = 64, PE = 32
WMem = 416 TMem = 32
Extracting FCBN complex, ins = 1024 outs = 1024
Layer 1: 1024 x 1024, SIMD = 32, PE = 64
WMem = 512 TMem = 16
Extracting FCBN complex, ins = 1024 outs = 1024
Layer 2: 1024 x 1024, SIMD = 64, PE = 32
WMem = 512 TMem = 32
Extracting FCBN complex, ins = 1024 outs = 10
Layer 3: 16 x 1024, SIMD = 8, PE = 16
WMem = 128 TMem = 1
Config header file:



#define L0_SIMD 64
#define L0_PE 32
#define L0_WMEM 416
#define L0_TMEM 32
#define L0_MW 832
#define L0_MH 1024

#define L1_SIMD 32
#define L1_PE 64
#define L1_WMEM 512
#define L1_TMEM 16
#define L1_MW 1024
#define L1_MH 1024

#define L2_SIMD 64
#define L2_PE 32
#define L2_WMEM 512
#define L2_TMEM 32
#define L2_MW 1024
#define L2_MH 1024

#define L3_SIMD 8
#define L3_PE 16
#define L3_WMEM 128
#define L3_TMEM 1
#define L3_MW 1024
#define L3_MH 16

masaaki@masaaki-VirtualBox2:~/


すると、binparam-lfc-pynq ディレクトリができていた。
BNN-PYNQ_60_170528.png

binparam-lfc-pynq ディレクトリの中身を示す。
BNN-PYNQ_61_170528.png

これはちょうど ~/BNN-PYNQ/bnn/params/mnist ディレクトリと同じだ。
BNN-PYNQ_62_170529.png

CIFAR-10 ConvNet は、どれだけ時間がかかるか恐ろしい。今、GPU のGTX1060を購入したので、Ubuntu とWindowsのデュアルブートにして、Ubuntu でどのくらいトレーニングに時間がかかるか?調べてみたいと思う。
  1. 2017年05月29日 04:47 |
  2. DNN
  3. | トラックバック:0
  4. | コメント:0