SMYLE AgentによるPython上でのVPPLプログラム開発¶
注釈
本項のプログラムは開発途上です。現状は実験用の僅かな仮実装であり、今後も機能の追加、大幅な変更がなされる可能性があります。
Python 2.7用のパッケージである SMYLE Agentを使ったPythonスクリプトを記述し実行することで、以下のようにVPPLコードを一切記述することなく、SMYLEプロセッサ用のプログラム開発が可能となります。
- VPPLソースプログラムが自動生成されます
- 生成されたVPPLソースプログラムはVPPLコンパイラによりコンパイルされます
- ISIM上での実行を指定すると、コンパイルされたプログラムはISIM上で実行されます。
- ISIM上での実行結果はVPPLにより抽出され、呼び出し元のPythonスクリプトに結果として戻されます。
注釈
なお、ISIM上での実行以外にFPGAを指定してPythonからのFPGAボード上の実機実行を制御する計画はありますが、まだ未実装です。
簡単なプログラムサンプル¶
Python2.7用にかかれた簡単なサンプルプログラムの例を以下に示します。
#!
# coding: utf-8
"""SMYLEdeep Python package, sample program #000."""
# Copyright (C) 2017 TOPS SYSTEMS
### @file sampleSmyleDeep_000.py
### @brief SMYLEdeep Python package, sample program #000.
###
### サンプルプログラム。単純なベクトル演算処理例
###
### Contact: izumida@topscom.co.jp
###
### @author: M.Izumida
### @date: May 2, 2017
###
# Written for Python 2.7 (NOT FOR 3.x)
#=======================================================================
# インポート宣言
from __future__ import division
import sys
import re
import os
import numpy as np
from datetime import datetime
import smyleDeep as sd
#=======================================================================
# メインプログラム
def main():
"""単純なベクトル演算処理例
"""
Agent = sd.session.Agent('ISIM')
Agent.prepareDataFlow("VectorAdd")
dat1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
dat2 = [10, 10, 10, 20, 20, 20, 30, 30, 30, 40, 40, 40, 100, 100, 100, 100]
i_Vect1 = sd.vppl.Variable('vList', 'vi1', ['u16', len(dat1), dat1])
i_Vect2 = sd.vppl.Variable('vList', 'vi2', ['u16', len(dat2), dat2])
work_Vect = sd.vppl.Variable('vector', 'vu16temp', ['u16', len(dat1), 0])
nodeResult = sd.vppl.VectOpr2(i_Vect1, i_Vect2, ['add$UW', len(dat1)], name='vu16temp')
Agent.buildDataFlow(nodeResult, len(dat1))
#results = Agent.compile()
results = Agent.run()
print
print "result = ", results
#=======================================================================
#
if __name__ == "__main__":
main()
** モジュールのインポート **
PythonとVPPL間のデータの受け渡しに numpy配列を使用していますので、Python上でnumpyパッケージをインストールした上でインポートしてください。 また、SMYLE Agent機能を呼び出すために、smyleDeepパッケージをご使用のPythonからインポート可能なパスに設置した上でインポートしてください。
** セッション **
SMYLE Agent機能は、セッションとよぶ一塊の作業を単位に機能します。 セッションの開始には session.Agentクラスにどのようなセッションにするか(現状は ISIMセッションのみサポート。FPGA対象では異なるセッション属性となる)指定する必要があります。 次にセッション内のデータフローグラフを初期化するのに prepareDataFlowメソッドを呼び出します。 これに与える引数はデータフローの識別のための任意の名前文字列です。 VPPLプログラムを自動生成する際のソリューション名ともなります。
** データ **
セッションに与えるデータは、通常の Pythonのリスト構造でかまいません。 上記例の dat1、dat2のようにベクトル値を書きます。
** 処理フローの定義 **
vppl.Variableメソッドを使って、処理で使われる「変数ノード」の定義を行います。引数は以下のとおりです。
- 第1引数 変数の種別
- 第2引数 処理フロー内での識別子(名前)
- 第3引数 実体変数の指定リスト。最初の要素が要素型、次の要素が要素の長さ、次の要素が実体データ
定義した「変数ノード」間の処理を VectOpr2などのデータ処理関数を使って記述し、「処理ノード」として代入します。 全体としてループのないツリー構造となるように、変数と処理の関係を記述します。
** 処理フローの構築 **
buildDataFlowメソッドの第1引数に適当なノードを指定することで、そのノードが最終の出力として認識されます。 そのノードに接続する全ての処理ノード、変数ノードが遡って探索され、全体としてのデータフローが構築されます。 第2引数に結果出力の長さを与えます。
** 実行 **
runメソッドを呼び出すと、上記の処理フローがVPPLのソースとして吐き出され、コンパイルされ、ISIM上で実行されそして実行結果が返されます。 compileメソッドを呼び出すと、コンパイルまで行われますが、実行結果はコンパイルの結果を示す数値となります。