VIOS並列画像処理言語VPEーp

目 次
 

  • はじめに
  • メインフロー部
  • 画像処理モジュール部
  • モジュールで使用できる一般的な命令
    1. 変数
    2. 演算子
    3. 数学関数
    4. モジュールで使用できるVIOS固有の命令
      1. 並列処理命令
      2. 内部関数
  • 並列実行単位・ワーキング セットについて
    1. ワーキングセットが持つ情報
  • 大域変数制御命令について
  • VIOSでのフロー制御について
  • より効率の良い並列実行をするために

  •  

     
     
     
     
     
     
     
     
     
     
     
     
     


  • はじめに

  •  

     

    VIOSにおけるプログラミングは、C言語に非常に良く似たVPEーpと言う言語を使用して行います。
    VPEーpはインタープリタ言語であり、必要最低限の命令しか持っていません。
    しかし、ユーザが追加命令を作成するにより並列画像処理を行うことが出来るようになります。

    追加命令は、VPEーpで記述します。それはVIOSにより一端C++のソースに変換、
    そしてコンパイルされ、VPEーpの1命令として組み込まれます。

  • メインフロー部

  •  

     

    VIOSでは、ユーザが定義した画像処理モジュールをメインフロー記述部から呼び出すことにより
    画像処理を行います。メインフロー記述部は、以下のように記述 します。

    main()
    {
      // 画像データを保持する変数を宣言します。
      image Image1, Image2;       
      
       // 変数Image1に画像ファイルを読み込みます。
      Image1 = load("画像ファイル名1"); 
    
      // ユーザが定義したモジュール"usermodule"を呼び出します。
      usermodule(Image1, Image2);     
      // Image2を画面に表示します。
      disp(Image2);               
      // Image2を「画像ファイル名2」の名前で保存します。
      save(Image2, "画像ファイル名2");
    }
  • 画像処理モジュール部(追加命令記述部)

  •  

     

    VIOSでは単一の画像処理をモジュールとして扱います。モジュールの宣言は以下 の通りです。

    module module_name(...)

    module_nameには、その画像処理モジュールの名前を記述します。その後ろに続く括弧の中には、
    そのモジュールが受け取る引数を指定します。引数には、入力画像、出力画像、数値パラメータの
    3種類があります。括弧内にお いてそれぞれ次のように記述します。

    module module_name (
      入力画像1, …, 入力画像l : input,
      出力画像1, …, 出力画像m : output,
      パラメータ1, …, パラメータn : parameter )

    モジュール宣言の次に、モジュールの引数の定義を行います。書式は以下の通り です。

    型名 変数名 [on 分割方法 [cache 大きさ]];

    型名の部分は変数名で示される引数の型を指定します。このとき、変数が画像である場合、型名は
    その画像の画素の型となります。パラメータの場合はその変数 そのものの型となります。
    使用できる型はint, floatの2種類です。また、パラメータは多 次元配列も使用可能です。
    変数名の以下に続くon以降は画像のみに適用されます。 分割方法にはワーキングセットごとに
    画像を分割する際の分割方法を指定します。指定できる分割方法は
     

  • pixel           : 画素ごとに分割
  • row            : 行ごとに分割
  • column        : 列ごとに分割
  • box[w][h]    : 小領域ごとに分割
  • all              : 分割しない

  •  

     

    の5通りの方法があります。この後ろに続くcache以降は、画像を分割し た際に、その周辺情報が
    必要な場合に用いる画像データキャッシュの指定であり、 大きさの部分に周辺領域の半径を指定
    します。必要がない場合は省略可能です。

  • モジュールで使用できる一般的な命令

  •  

     

    画像処理モジュール内では以下のものを用いることができます。

  • 変数

  • : C言語で用いることのできる変数のうち、ポインタ変数、 構造体、文字以外の変数を用いること
    ができます。宣言はC言語と同様に{} ブロックの最初に行います。また、モジュール内すべてで
    アクセス可能な大域変数は、モジュール内の先頭の位置に記述します。モジュール引数の数値
    パラメータも大域変数として扱われます。

  • 演算子

  • : C言語で用いることのできる演算子のうち、ポインタ、 構造体に関するもの以外の演算子が
    使用可能です。


  • : C言語と同様の文が使用可能です。

  • 数学関数

  • : sin, cos, tan, asin, acos, atan, logの数学関数が使用可 能です。

  • モジュールで使用できるVIOS固有の命令

  •  

     

    VIOSでは、画像処理を効率良く行うため、いくつかの固有の命令を持ちます。以下に、
    それらの命令について示します。

  • 並列処理命令

  • 画像処理モジュール内に記述された処理は逐次命令となり、並列処理は行われません。
    VIOSでは並列処理を行うにはparallel文を使用します。以下にその使用例を示します。
      /* 逐次処理部分を記述します */
      ‥‥
      parallel{
        /* 並列処理部分を記述します */
        ‥‥
      }
    VIOSでは、parallel文内部においては、画像は ワーキングセットごとに分割されるため、
    画像の画素値へのアクセス方法が通常のC言語などのプログラムとは多少異 なります。
    parallel文内部でのアクセス方法は以下の通りです。
  • Image1[x][y]

  • : 相対座標指定
    それぞれのワーキングセットが保持している画像の左上を(0, 0)とする相対座標 (x, y)の位置にある画素へアクセスします。座標の指定を省き[]と記述 した場合は、座標値0が指定されたものとします。
     
  • Image1[[x]][[y]];

  • : 絶対座標指定
    画像全体における絶対座標(x, y)の位置にある画素へアクセスします。
    分割方法にallが適用されている画像については、相対座標指定、絶対座 標指定ともに同一の処理
    となります。どちらの指定を用いた場合も、アクセスさ れる画素が同一ワーキングセット外にある
    場合は次に示すboundary命令 で指定された方法で画素値を取得します。
  • 内部関数
  • hotx, hoty

  • : 分割画像の注目画素の絶対位置を取得します。 parallel文内において使用します。
      // 画像Image1の絶対座標におけるx座標を変数xに代入します。
      x = hotx(Image1);   
      // 画像Image1の絶対座標におけるy座標を変数yに代入します。
      y = hoty(Image1);
  • width, height

  • : 指定の画像の分割前の横方向、縦方向の大き さを取得します。
      // 画像Image1の横方向(x方向)の大きさを変数wに代入します。
      w = width(Image1);  
      // 画像Image1の縦方向(y方向)の大きさを変数hに代入します。
      h = height(Image1);



    VIOSトップページへ戻る