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メソッドを呼び出すと、コンパイルまで行われますが、実行結果はコンパイルの結果を示す数値となります。

簡単なプログラムサンプルの実行結果

Windows上のコマンドプロンプトから、上記のサンプルプログラムを実行した場合の画面出力を以下に示します。

sample program screen photo