読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #8)

前回までで独自にビルドしたハードウェアを使ってLinuxを立ち上げることに成功した。

次に、ZedBoardに付属しているLEDを制御する。LEDを制御するためのハードウェアは、myLEDというIPとして実装し、あらかじめPL部に組み込んである。

devmem2を使えるようにするための環境

LEDを制御するためのデバイスドライバを開発する前に、devmem2を利用してメモリアドレスにマッピングしたLEDが利用できることを確かめる。

  • devmem2

armadillo.atmark-techno.com

devmem2を利用すれば、任意の物理アドレスに対してメモリの読み書きを実行することができる。

参考にしたのは以下の記事だ。

qiita.com

上記の記事ではdevmem2をapt-getにて取得しているのだが、なぜか私のデザインではEthernetに接続することができない。

仕方がないので、あらかじめdevmem2が入っているLinaroのパッケージを代わりにダウンロードして展開し、起動させることにした。

Linaro Releases

上記のページから、linaro-vivid-developer-20151215-714.tar.gzをダウンロードしてSDカードのパーティション2に展開する。

sudo mount /dev/sdb2 /mnt/ZED_ROOTFS/
wget https://releases.linaro.org/ubuntu/images/developer/latest/linaro-vivid-developer-20151215-714.tar.gz
sudo tar --strip-components=1 -C /mnt/ZED_ROOTFS/ -xzpf linaro-vivid-developer-20151215-714.tar.gz
umount /mnt/ZED_ROOTFS

これでSDカードをZedBoardに指して起動すると、devmem2のあらかじめインストールされているUbuntuを起動することができた。

devmem2を使ってLEDにアクセスする

myLEDのIPは、ZedBoardのPL部内で、以下のアドレスにマッピングされている。

f:id:msyksphinz:20170530011406p:plain

したがって、以下のようにアクセスすればよかろう。

devmem2 0x43c00000 b 0x0f

f:id:msyksphinz:20170530012406p:plain

LEDが点灯した!うまく制御できているようだ。

f:id:msyksphinz:20170530012742p:plain

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

6th RISC-V Workshopの全発表資料が公開されました

f:id:msyksphinz:20170503012538p:plain

riscv.org

6th RISC-V Workshopの記事が公開された。一個ずつチェックしていこう。

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #7)

前回まででU-BootでLinuxをブートする準備が整った。次に、Linuxのルートファイルイメージを用意しよう。

今回も簡単化のため、既に存在するイメージを利用した。LinaroのUbuntuのイメージだ。

参考にしたのは以下のページ。

qiita.com

以下のページから最新のUbuntuのイメージをダウンロードする。そしてSDカードのパーティション2に展開する。

Linaro Releases

wget http://releases.linaro.org/ubuntu/images/nano/15.07/linaro-vivid-nano-20150722-708.tar.gz
sudo mount /dev/sdcb /mnt/ZED_ROOTFS/
sudo tar --strip-components=1 -C /mnt/ZED_ROOTFS/ -xzpf linaro-vivid-nano-20150722-708.tar.gz
sudo sync

こうしてSDカードを更新し、ZedBoardに挿入して電源を入れると、無事にUbuntuが起動した。

f:id:msyksphinz:20170527143043p:plain

やっとスタート地点に立ったかな。あとはIPの改造を試行するだけだ。

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #6)

最初に作成したブートイメージを試行して、ZedBoardで何故かブートできなかったので、いろいろ立ち戻って調査していたのだが、やはりZybo用のものを使うのは結構ハードルが高くて、Xilinxのオフィシャルパッケージを使うほうが楽なのかもしれないと思い出した。

まずはXilinxオフィシャルのLinux, U-Boot, devicetreeモデルを使って、ZedBoardを立ち上げるのをやり直してみることにした。 #ここまでくるとあまり記事のタイトルと関係なくなっているが。。。

使用するデザイン

これはこれまでのものと同じものを利用した。

github.com

U-Bootの作成

まずは必要パッケージをインストール。

sudo apt install libssl-dev device-tree-compiler

これまでのDigilentのものではなく、Xilinxのものを利用した。

github.com

zynq-common.hに以下のような変更を加える。

diff --git a/include/configs/zynq-common.h b/include/configs/zynq-common.h
index 204b1ba..5081901 100644
--- a/include/configs/zynq-common.h
+++ b/include/configs/zynq-common.h
@@ -199,6 +199,10 @@
 #define CONFIG_PREBOOT

 /* Default environment */
+#ifdef CONFIG_EXTRA_ENV_SETTINGS
+#undef CONFIG_EXTRA_ENV_SETTINGS
+#endif
+
 #ifndef CONFIG_EXTRA_ENV_SETTINGS
 #define CONFIG_EXTRA_ENV_SETTINGS      \
        "ethaddr=00:0a:35:00:01:22\0"   \
@@ -256,12 +260,11 @@
                "fi\0" \
        "sdboot=if mmcinfo; then " \
                        "run uenvboot; " \
-                       "echo Copying Linux from SD to RAM... && " \
+                       "echo Copying Linux from SD to RAM... RFS in ext4 && " \
                        "load mmc 0 ${kernel_load_address} ${kernel_image} && " \
                        "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
-                       "load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
-                       "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
-               "fi\0" \
+            "bootm ${kernel_load_address} - ${devicetree_load_address}; " \
+       "fi\0"                                                                                                                          \
        "usbboot=if usb start; then " \
                        "run uenvboot; " \
                        "echo Copying Linux from USB to RAM... && " \

以下の要領でビルドする。

export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
git clone https://github.com/Xilinx/u-boot-xlnx.git
cd u-boot-xlnx
git checkout xilinx-v2017.1
make zynq_zed_defconfig
make

これでu-bootが作成されるので、ファイル名u-bootu-boot.elfに変更した。

BOOT.binの再作成

FPGAのブート用デザインBOOT.binを再作成した。このとき、新しく作成したu-boot.elfを指定してBOOT.binを作成した。

f:id:msyksphinz:20170527140633p:plain

Linuxのビルド

これまでのDigilentのものではなく、Xilinxのものを利用した。

github.com

git clone https://github.com/Xilinx/linux-xlnx.git
cd linux-xlnx
git checkout xilinx-v2017.1
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make distclean
make ARCH=arm xilinx_zynq_defconfig && make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage

これでuImageが作成される。

devicetreeの作成

こちらも、Xilinxのものを利用した。

github.com

git clone https://github.com/Xilinx/device-tree-xlnx.git
git checkout xilinx-v2017.1

ここからはSDKでの作業になるようだ。以下のページを参考して、devicetreeを作成した。

qiita.com

ただし最後のdevicetree.dtbの作成は以下のように少しコマンドと入力ファイルを変更した。

cd path/to/sdk/device_tree_bsp_0
path/to/linux-xlnx/scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb system-top.dts

まずは、これらから作成した、

  • BOOT.bin
  • devicetree.dtb
  • uImage

をSDカードの最初のパーティションにコピーした。

sudo mount /dev/sdb2 /mnt/ZED_BOOT
sudo cp ./zedboard_hdl_201701/projects/adv7511/zed/adv7511_zed.sdk/std_FSBL/bootimage/BOOT.bin /mnt/ZED_BOOT
sudo cp ./zedboard_hdl_201701/projects/adv7511/zed/adv7511_zed.sdk/device_tree_bsp_0/devicetree.dtb /mnt/ZED_BOOT
sudo cp ./linux-xlnx/arch/arm/boot/uImage /mnt/ZED_BOOT

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #5)

前回の続き。ZedBoard向けのFSBLを作成する。

ハードウェアをエクスポートして、SDKを起動した。

[New] –> [Application Project]をクリックして、新しいアプリケーションプロジェクトを作成した。

新しいプロジェクト名として、「myLED_FSBL」を記入して、ウィザードを進めていく。

f:id:msyksphinz:20170525002851p:plain

[Templates]は、"Zynq FSBL"を選択する。

f:id:msyksphinz:20170525002901p:plain

これで、"myLED_FSBL"が作成された。

f:id:msyksphinz:20170525002909p:plain

とりあえずこのまま"myLED_FSBL"のメニューから、"Create Boot Image"を選択した。

f:id:msyksphinz:20170525002931p:plain

先ほど作成した”boot.bin"を追加する。

f:id:msyksphinz:20170525002942p:plain

f:id:msyksphinz:20170525002951p:plain

myLED_FSBLのプロジェクト内、"bootimage"に、"BOOT.bin"が追加されていることが分かる。

yuki-sato.comの「LinuxからFPGAを使ってみる」をやってみる (ZedBoard版 #4)

前回の続き。前回はハードウェアデザインまで作成したのだが、直後に自作したIPが壊れてしまい、環境を構築しなおしたのだった。

さらに、ZedBoardのADV7511の環境を引っ張ってきた場合、ブロックデザインのsystem.vまではLEDの出力ポートが生成されるのだが、そこから先のi_system_wrapperであるとか、さらに上位のsystem_topには反映されないということが分かり、デザインの修正を行う必要が出てきた。

f:id:msyksphinz:20170525001728p:plain

ZedBoardのLEDはどのポートに割り付けられているのか?

zed_system_constr.xdcを見てみると、以下のポートがZedBoardのLEDに割り付けられていることが分かった。

set_property  -dict {PACKAGE_PIN  T22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]]      ; ## LD0
set_property  -dict {PACKAGE_PIN  T21   IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]]      ; ## LD1
set_property  -dict {PACKAGE_PIN  U22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]]      ; ## LD2
set_property  -dict {PACKAGE_PIN  U21   IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]]      ; ## LD3
set_property  -dict {PACKAGE_PIN  V22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[23]]      ; ## LD4
set_property  -dict {PACKAGE_PIN  W22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[24]]      ; ## LD5
set_property  -dict {PACKAGE_PIN  U19   IOSTANDARD LVCMOS33} [get_ports gpio_bd[25]]      ; ## LD6
set_property  -dict {PACKAGE_PIN  U14   IOSTANDARD LVCMOS33} [get_ports gpio_bd[26]]      ; ## LD7

このうち下位の4bit、gpio_bd[22:19]までを自作IPの出力ポートとして利用したい。したがって、これらをコメントアウトし、新しいポートを接続することになる。

#set_property  -dict {PACKAGE_PIN  T22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]]      ; ## LD0
#set_property  -dict {PACKAGE_PIN  T21   IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]]      ; ## LD1
#set_property  -dict {PACKAGE_PIN  U22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]]      ; ## LD2
#set_property  -dict {PACKAGE_PIN  U21   IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]]      ; ## LD3
set_property  -dict {PACKAGE_PIN  V22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[19]]      ; ## LD4
set_property  -dict {PACKAGE_PIN  W22   IOSTANDARD LVCMOS33} [get_ports gpio_bd[20]]      ; ## LD5
set_property  -dict {PACKAGE_PIN  U19   IOSTANDARD LVCMOS33} [get_ports gpio_bd[21]]      ; ## LD6
set_property  -dict {PACKAGE_PIN  U14   IOSTANDARD LVCMOS33} [get_ports gpio_bd[22]]      ; ## LD7

set_property  -dict {PACKAGE_PIN  T22   IOSTANDARD LVCMOS33} [get_ports led[0]]      ; ## LD0
set_property  -dict {PACKAGE_PIN  T21   IOSTANDARD LVCMOS33} [get_ports led[1]]      ; ## LD1
set_property  -dict {PACKAGE_PIN  U22   IOSTANDARD LVCMOS33} [get_ports led[2]]      ; ## LD2
set_property  -dict {PACKAGE_PIN  U21   IOSTANDARD LVCMOS33} [get_ports led[3]]      ; ## LD3

その際、gpio_bdのポート位置もずらしていった。gpio_bdのポート数は32本から28本になるので、デザインも少し書き換える。

具体的には、system_top.vのgpioの双方向ポートの制御を以下のように変更し、28本に対応させた。

  • 変更前
  ad_iobuf #(
    .DATA_WIDTH(28)
  ) i_iobuf (
    .dio_t(gpio_t),
    .dio_i(gpio_o),
    .dio_o(gpio_i),
    .dio_p(pio_bd));
  • 変更後
  ad_iobuf #(
    .DATA_WIDTH(28)
  ) i_iobuf (
    .dio_t({gpio_t[31:23], gpio_t[18:0]}),
    .dio_i({gpio_o[31:23], gpio_o[18:0]}),
    .dio_o({gpio_i[31:23], gpio_i[18:0]}),
    .dio_p(gpio_bd[23:0]));

上記の変更を行い、ハードウェアの再合成、bitstreamの生成を行ったうえで、ソフトウェアデザインへのエクスポートを行い、SDKを立ち上げた(この辺の作業は省略)。

ZedBoard用U-Bootのビルド

U-Bootのビルド方法は以下に従う。

source /opt/Xilinx/SDK/2017.1/settings64.sh
git clone https://github.com/DigilentInc/u-boot-Digilent-Dev.git
cd u-boot-Digilent-Dev/
git checkout master-next

source /opt/Xilinx/SDK/2017.1/settings64.sh
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zynq_zed_config
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-

ZedBoard向けLinuxのビルド

同様に、ZedBoard向けのLinuxのビルドは以下の手順に従った。

sudo apt install u-boot-tools
git clone https://github.com/DigilentInc/Linux-Digilent-Dev.git
cd Linux-Digilent-Dev
git checkout master-next

make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- UIMAGE_LOADADDR=0x8000 uImage

以下のメッセージが出て、Linuxが生成された。

  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' は更新済みです.
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  CHK     kernel/config_data.h
  Kernel: arch/arm/boot/Image is ready
  Kernel: arch/arm/boot/zImage is ready
  UIMAGE  arch/arm/boot/uImage
Image Name:   Linux-3.18.0-xilinx-46110-gd627f
Created:      Thu May 25 00:23:21 2017
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    3447872 Bytes = 3367.06 kB = 3.29 MB
Load Address: 00008000
Entry Point:  00008000
  Image arch/arm/boot/uImage is ready

関連記事

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

64bit BOOMプロセッサでCoremarkを動作させたい (2. RTLによるシミュレーション)

前回に引き続き、RocketChipおよびBOOMでCoremarkを動作させる。いろいろ調査した結果、RocketChipとBOOMでコンパイラを切り分けなければならないので、 それを適用してCoremarkをコンパイルしてみる。

ここでは、RocketChip版は${ROCKET_CHIP} リポジトリ、BOOM版は${BOOM}リポジトリで作業することにする。

また、Freedom-e-sdkリポジトリ${FREEDOM}、Coremarkのファイル群を、${COREMARK}に格納しているものとする。

また、RocketChip版のGCC${RISCV_ROCKET}, BOOM版のGCC${RISCV_BOOM}に格納されているものとする。

  • RocketChipt版
cd ${ROCKET_CHIP}/riscv-tools/riscv-tests/benchmarks
mkdir coremark && cd coremark
# Freedom-e-sdkからCoremarkのコードの一部をコピーする。
cp ${FREEDOM}/software/coremark/core_portme.* .
# Coremarkファイル群をコピーする
cp ${COREMARK}/*.c .
cp ${COREMARK}/*.h .
  • BOOM版
cd ${BOOM}/riscv-tools/riscv-tests/benchmarks
mkdir coremark && cd coremark
# Freedom-e-sdkからCoremarkのコードの一部をコピーする。
cp ${FREEDOM}/software/coremark/core_portme.* .
# Coremarkファイル群をコピーする
cp ${COREMARK}/*.c .
cp ${COREMARK}/*.h .

core_portme.h を以下のように変更する。

// #define COMPILER_FLAGS FLAGS_STR
#define COMPILER_FLAGS "-DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf"

core_portme.c は以下のように変更する。ITERATIONSはシミュレーション時間によって変更する。今回は2に設定した。

#define ITERATIONS 2

#include <stdio.h>
#include <stdlib.h>
#include "coremark.h"
// #include "platform.h"
#include "encoding.h"

...

void start_time(void)
{
  // get_timer_value()はサポートしてないのでコメントアウト
  // t0 = get_timer_value();
}

void stop_time(void)
{
  // get_timer_value()はサポートしてないのでコメントアウト
  // t1 = get_timer_value();
}

...

// 10秒以上Coremarkを動作させないとエラーになるので、疑似的に実行時間を10.0に設定する。
secs_ret time_in_secs(CORE_TICKS ticks)
{
  // scale timer down to avoid uint64_t -> double conversion in RV32
  int scale = 256;
  uint32_t delta = ticks / scale;
  // uint32_t freq = get_timer_freq() / scale;
  // uint32_t freq = 100;
  // return delta / (double)freq;
  return 10.0;
}

実際にコンパイルを実行する。

  • RocketChip版
$ PATH=${ROCKET_RISCV}/bin/:${PATH} make clean coremark.riscv
...
msyksphinz@msyksphinz-virualbox:~/work/rocket-chip-rocket/emulator$ make output/coremark.riscv.out CONFIG=DefaultConfig
./emulator-rocketchip-DefaultConfig +max-cycles=100000000 +verbose output/coremark.riscv 2> output/coremark.riscv.out && [ $PIPESTATUS -eq 0 ]
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 0
Total time (secs): %f
Iterations/Sec   : %f
Iterations       : 2
Compiler version : GCC7.1.1 20170509
Compiler flags   : -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x72be
Correct operation validated. See readme.txt for run and reporting rules.
  • BOOM版
$ PATH=${BOOM_RISCV}/bin/:${PATH} make clean coremark.riscv
make output/coremark.riscv.out CONFIG=BOOMConfig
./emulator-rocketchip-BOOMConfig +max-cycles=100000000 +verbose output/coremark.riscv 3>&1 1>&2 2>&3 | /home/msyksphinz/riscv-boom/bin/spike-dasm  > output/coremark.riscv.out && [ $PIPESTATUS -eq 0 ]
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 0
Total time (secs): %f
Iterations/Sec   : %f
Iterations       : 2
Compiler version : GCC6.1.0
Compiler flags   : -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -fno-builtin-printf
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0x72be
Correct operation validated. See readme.txt for run and reporting rules.
msyksphinz@msyksphinz-virualbox:~/work/rocket-chip-boom/emulator$

なんとなく動作はしているなー。

サイクル数を取得する

それぞれのRTLシミュレーションログから、サイクル数を取得しよう。

  • RocketChip版
PATH=${ROCKET_RISCV}/bin:${PATH} riscv64-unknown-elf-nm output/coremark.riscv | grep -e start_time -e stop_time
0000000080001c04 T start_time
0000000080001c06 T stop_time
$ grep -e 80001c04 -e 80001c06 output/coremark.riscv.out
C0:     235555 [1] pc=[0080001c04] W[r 0=0000000080001c06][1] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067)
C0:     235556 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067)
C0:     235557 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067)
C0:     235558 [0] pc=[0080001c04] W[r 0=0000000080001c06][0] R[r 1=0000000080002bb8] R[r 0=0000000000000000] inst=[00008067] DASM(00008067)
C0:    1252559 [1] pc=[0080001c06] W[r 0=0000000080001c08][1] R[r 1=0000000080002bd2] R[r 0=0000000000000000] inst=[00008067] DASM(00008067)
C0:    1252560 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067)
C0:    1252561 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067)
C0:    1252562 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067)
C0:    1252563 [0] pc=[0080001c06] W[r 0=0000000080001c08][0] R[r 1=0000000000000000] R[r 0=0000000000000003] inst=[00008067] DASM(00008067)

したがって、

  • start_time : 235555
  • stop_time : 1252559

と見ることができる。

  • BOOM版
PATH=${BOOM_RISCV}/bin:${PATH} riscv64-unknown-elf-nm output/coremark.riscv | grep -e start_time -e stop_time
0000000080002110 T start_time
0000000080002114 T stop_time
$ grep -e 80002110 -e 80002114 output/coremark.riscv.out
    174448; O3PipeView:fetch:           338334000:0x0080002110:0:    174448:ret
   1120353; O3PipeView:fetch:          1019847000:0x0080002114:0:   1120353:ret

したがって、

  • start_time : 174448
  • stop_time : 1120353

と見ることができる。

ITERATION=2とは言え、かなり遅いなあ。本当にあっているのだろうか?ECCが合っているので実行自体は正しいのだろうけど。

f:id:msyksphinz:20170524000502p:plain

関連記事

msyksphinz.hatenablog.com