(57)【要約】  オフロードサーバ（１）は、アプリケーションの繰り返し文を特定し、各繰り返し文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部（１１３）と、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部（１１４）と、並列処理パターンのアプリケーションをコンパイルして、検証用マシン（１４）に配置し、性能測定用処理を実行する性能測定部（１１５）と、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成する実行ファイル作成部（１１６）と、を備える。
2019216127.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションの特定処理をアクセラレータにオフロードするオフロードサーバであって、
アプリケーションのソースコードを分析するアプリケーションコード分析部と、
前記アプリケーションの繰り返し文を特定し、特定した各前記繰り返し文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部と、
コンパイルエラーが出る繰り返し文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部と、
前記並列処理パターンの前記アプリケーションをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部と、
性能測定結果をもとに、複数の前記並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成する実行ファイル作成部と、
を備えることを特徴とするオフロードサーバ。
【請求項２】
性能試験項目を格納するテストケースデータベースを有する記憶部と、
ユーザ向けの本番環境に実行ファイルを配置後、テストケースデータベースから性能試験項目を抽出し、性能試験を実行する性能測定テスト抽出実行部と、
を備えることを特徴とする請求項１に記載のオフロードサーバ。
【請求項３】
前記並列処理指定部は、前記アクセラレータにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出するオフロード範囲抽出部と、
中間言語ファイルを出力する中間言語ファイル出力部と、を備え、
前記性能測定部は、前記アクセラレータ検証用装置に、中間言語から導かれる実行ファイルを配置し、
配置したバイナリファイルを前記アクセラレータ検証用装置に実行させ、オフロードした際の性能を測定させるとともに、性能測定結果を取得して、前記オフロード範囲抽出部に戻し、
前記オフロード範囲抽出部は、別の前記並列処理パターンの抽出を行い、
前記中間言語ファイル出力部は、抽出された中間言語をもとに、性能測定を試行し、
前記実行ファイル作成部は、所定回数繰り返された、前記性能測定結果をもとに、複数の前記並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成する
ことを特徴とする請求項１に記載のオフロードサーバ。
【請求項４】
前記実行ファイル作成部は、前記アプリケーションの実利用の間に、前記アクセラレータ検証用装置において性能測定を繰り返し行い、最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成し、所定のタイミングで、実利用環境に配置する
ことを特徴とする請求項１に記載のオフロードサーバ。
【請求項５】
前記並列処理指定部は、遺伝的アルゴリズムに基づき、
コンパイルエラーが出ない繰り返し文の数を遺伝子長とし、
前記並列処理パターン作成部は、アクセラレータ処理をする場合を１または０のいずれか一方、しない場合を他方の０または１として、アクセラレータ処理可否を遺伝子パターンにマッピングし、
前記遺伝子の各値を１か０にランダムに作成した指定個体数の前記遺伝子パターンを準備し、
前記性能測定部は、各個体に応じて、前記アクセラレータにおける並列処理指定文を指定したアプリケーションコードをコンパイルして、前記アクセラレータ検証用装置に配置し、
前記アクセラレータ検証用装置において性能測定用処理を実行し、
前記実行ファイル作成部は、全個体に対して、性能測定を行い、処理時間の短い個体ほど適合度が高くなるように評価し、
全個体から、性能の高い個体を選択し、
選択された個体に対して、交叉、突然変異の処理を行い、次世代の個体を作成し、
指定世代数の処理終了後、最高性能の前記並列処理パターンを解として選択する
ことを特徴とする請求項１に記載のオフロードサーバ。
【請求項６】
前記性能測定部は、途中世代で、以前と同じ前記並列処理パターンの遺伝子が生じた場合は、当該並列処理パターンに該当するアプリケーションコードのコンパイル、および、性能測定はせずに、性能測定値としては同じ値を使う
ことを特徴とする請求項５に記載のオフロードサーバ。
【請求項７】
前記性能測定部は、コンパイルエラーが生じるアプリケーションコード、および、性能測定が所定時間で終了しないアプリケーションコードについては、タイムアウトの扱いとして、性能測定値を所定の長時間に設定する
ことを特徴とする請求項５に記載のオフロードサーバ。
【請求項８】
コンピュータを、請求項１乃至請求項７のいずれか１項に記載のオフロードサーバとして機能させるためのオフロードプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、機能処理をＧＰＵ（Graphics Processing Unit）等のアクセラレータに自動オフロードするオフロードサーバおよびオフロードプログラムに関する。
【背景技術】
【０００２】
近年、ＩｏＴ（Internet of Things）技術が進展しており，デバイス側で収集したデータをネットワークを介してクラウド技術を用いて分析し可視化するといったアプリケーションが続々と出現している。
従来ＩｏＴのサービスは、デバイスからネットワーク、アプリケーションまで一体構築されたサイロ型が多かった。しかし、よりコストを下げ多様なサービスを提供するため、デバイスを複数アプリケーションで共有し、クラウド、ネットワーク、デバイスのリソースをダイナミックに連携してサービス化するOpenＩｏＴの概念が注目されている。【０００３】
OpenＩｏＴでは、街中の複数団体が持つ監視カメラを共有し、迷子の探索やテロリストの発見等、複数の用途に使うことが期待される。しかし、この例で、カメラ映像の画像処理を複数の用途で用いることは、デバイス側、クラウド側のどこで分析するとしても、ＣＰＵ計算リソースが膨大になる。【０００４】
一方、近年、ＩｏＴ等多彩な分野に対応するため、ＣＰＵ以外のヘテロな計算リソースを用いることが増えている。例えば、ＧＰＵ（Graphics Processing Unit）(アクセラレータ)を強化したサーバで画像処理を行ったり、ＦＰＧＡ（Field Programmable Gate Array）(アクセラレータ)で信号処理をアクセラレートすることが始まっている。Amazon Web Services (AWS)（登録商標）では、ＧＰＵインスタンス、ＦＰＧＡインスタンスが提供されており、オンデマンドにそれらリソースを使うこともできる。Microsoft（登録商標）は、ＦＰＧＡを用いて検索を効率化している。【０００５】
OpenＩｏＴ環境では、サービス連携技術等を用いて、多彩なアプリケーションの創出が期待されるが、更に進歩したハードウェアを生かすことで、動作アプリケーションの高性能化が期待できる。しかし、そのためには、動作させるハードウェアに合わせたプログラミングや設定が必要である。例えば、ＣＵＤＡ（Compute Unified Device Architecture）、 OpenＣＬ（Open Computing Language）といった多くの技術知識が求められ、ハードルは高い。【０００６】
ＧＰＵやＦＰＧＡをユーザのＩｏＴアプリケーションで容易に利用できるようにするため下記が求められる。すなわち、動作させる画像処理、暗号処理等の汎用アプリケーションをOpenＩｏＴ環境にデプロイする際に、OpenＩｏＴのプラットフォームがアプリケーションロジックを分析し、ＧＰＵ、ＦＰＧＡに自動で処理をオフロードすることが望まれる。【０００７】
（Tacit Computing技術）
OpenＩｏＴ向けのプラットフォームに向けて、サービスからデバイスを自由に利用するための仕組みとしてTacit Computing技術が提案されている（非特許文献１参照）。Tacit Computingは、デバイスがその時点で保持するライブデータに基づき、ユーザが必要なデータを保持するデバイスをオンデマンドに発見し、利用することを可能にする技術である。【０００８】
図６は、Tacit Computingの概要を説明するための図である。
Tacit Computingでは、例えばＤＣ（Data Center）３０を有するクラウドレイヤ５０、ネットワークレイヤ６０、デバイスレイヤ７０の３層の中から、ユーザへのサービスに適切なリソースを発見し連携することにより、そのユーザのリクエストに応えサービスを継続する（図６の符号ａ）。また、３層の構成のうち、時々刻々変化する状況に対応するため、データが発生する現場に近いデバイスレイヤにおいてできるだけ処理を行うようにする（図６の符号ｂ）。より低いレイヤで処理を行うことにより、ネットワークトラフィックの削減や（図６の符号ｃ）、プライバシー性の高いデータの流出を抑えることができる（図６の符号ｄ）。【０００９】
このTacit Computingでは、その要素技術として、ライブデータ検索技術とデバイス仮想化技術を用いる。
ライブデータ検索技術は、ユーザにとって必要なデータを提供するデバイスを検索するための技術である。ＩｏＴサービスの例として、橋等の施設にセンサを複数設置し、劣化状況等をモニタリングするサービスがある。この場合、劣化状況が急激に進むとは考えられないため、数時間等の周期で複数点でのセンサデータをクラウドに上げ、劣化状況の変化を統計ソフトや機械学習により分析すればよい。これに対し、定点のカメラに映った人物に対して、情報案内や警告アラート等を行うサービスの例では、数秒程度しかカメラに人物は映らないし、また、その人物が写ったカメラの映像しかその人物には意味のないデータといえる。このように、デバイスレイヤで発生し、時々刻々変化するようなデータをライブデータと呼ぶ。【００１０】
ユーザにとって必要なこのライブデータを検索するため、Tacit Computingでは、クラウドレイヤにデータが上がってくるのを待つのではなく、下位レイヤに分析する機能を配置し、その下位レイヤにおいてライブデータを検索させる。
例えば、駅伝予選会に友人が参加しており、その友人が写ったカメラの映像を自動で繋いで欲しいとする。この場合、例えば友人のゼッケン番号を検索キーとしてリクエストすると、Tacit Computingでは、カメラを収容するゲートウェイ１０やネットワークエッジ２０に、OpenＣＶ（Open Source Computer Vision Library）等の画像分析機能を配置する。そして、カメラに近い場所で映像を分析することにより、友人のゼッケン番号が画像分析により抽出され、友人が映っているカメラを特定することができる。このようにして、Tacit Computingにおいてライブデータ検索技術が用いられる。【００１１】
次に、利用したいデバイスがライブデータ検索技術により特定された場合に、そのデバイスを実際に利用する必要がある。ＩｏＴデバイスは、多数のメーカーが開発しており、利用時のプロトコルやインタフェース、アドレス等がデバイス毎に異なる。そこで、デバイス仮想化技術によって、個々のデバイスにおけるインタフェースの違いを吸収する。
例えば、上記した例であれば、カメラ映像の取得のような共通のリクエストを元に、カメラを収容するゲートウェイ等で、デバイス毎のアダプタを設けておきプロトコル等の変換を行った上で、個々のカメラに応じたリクエストを行う。このようなデバイス仮想化技術を用いることにより、ユーザはデバイス個々の違いを意識せず、そのデバイスの利用が可能となる。【００１２】
（ＧＰＵへのオフロード）
ＧＰＵの計算能力を画像処理以外にも使うＧＰＧＰＵ（General Purpose GPU）のための開発環境ＣＵＤＡが発展している。ＣＵＤＡは、ＧＰＧＰＵ向けの開発環境である。また、ＧＰＵ、ＦＰＧＡ、メニーコアＣＰＵ等のヘテロハードウェアを統一的に扱うための標準規格としてOpenＣＬも登場している。【００１３】
ＣＵＤＡやOpenＣＬでは、Ｃ言語の拡張によるプログラミングを行う。ただし、ＧＰＵ等のデバイスとＣＰＵの間のメモリコピー、解放等を記述する必要があり、記述の難度は高い。実際に、ＣＵＤＡやOpenＣＬを使いこなせる技術者は数多くはいない。【００１４】
簡易にＧＰＧＰＵを行うため、ディレクティブベースで、ループ文等の並列処理すべき個所を指定し、ディレクティブに従いコンパイラがデバイス向けコードに変換する技術がある。技術仕様としてOpenＡＣＣ（Open Accelerator）等、コンパイラとしてＰＧＩコンパイラ（登録商標）等がある。例えば、OpenＡＣＣを使った例では、ユーザはC/C++/Fortran言語で書かれたコードに、OpenＡＣＣディレクティブで並列処理させる等を指定する。ＰＧＩコンパイラは、コードの並列可能性をチェックして、ＧＰＵ用、ＣＰＵ用実行バイナリを生成し、実行モジュール化する。IBM JDK（登録商標）は、Java（登録商標）のlambda形式に従った並列処理指定を、ＧＰＵにオフロードする機能をサポートしている。これらの技術を用いることで、ＧＰＵメモリへのデータ割り当て等を、プログラマーは意識する必要がない。【００１５】
このように、OpenＣＬ、ＣＵＤＡ、OpenＡＣＣ等の技術により、ＧＰＵへのオフロード処理が可能になっている。
【先行技術文献】
【非特許文献】
【００１６】
【非特許文献１】Y. Yamato, N. Hoshikawa, H. Noguchi, T. Demizu and M. Kataoka, "A study to optimize heterogenesous resources for Open IoT," 2017 Fifth International Symposium on Computing and Networking (CANDAR 2017), pp.609-611, Nov. 2017.
【非特許文献２】Y. Tanaka, M. Yoshimi. M. Miki and T. Hiroyasu, "Evaluation ofOptimization Method for Fortran Codes with GPU Automatic ParallelizationCompiler," IPSJ SIG Technical Report, 2011(9), pp.1-6, 2011.
【非特許文献３】Y. Yamato, M. Muroi, K. Tanaka and M. Uchimura, "Development of Template Management Technology for Easy Deployment of Virtual Resources on OpenStack," Journal of Cloud Computing, Springer, 2014, 3:7, DOI: 10.1186/s13677-014-0007-3, June 2014.
【非特許文献４】Y. Yamato, "Automatic verification technology of software patches for user virtual environments on IaaS cloud," Journal of Cloud Computing, Springer, 2015, 4:4, DOI: 10.1186/s13677-015-0028-6, Feb. 2015.
【発明の概要】
【発明が解決しようとする課題】
【００１７】
上記したOpenＣＬ、ＣＵＤＡ、OpenＡＣＣ等の技術により、ＧＰＵへのオフロード処理が可能になっている。
しかしながら、オフロード処理自体は行えるようになっても、適切なオフロードには課題が多い。例えば、Intelコンパイラ（登録商標）のように自動並列化機能を持つコンパイラがある。自動並列化する際は、プログラム上のfor文（繰り返し文）等の並列処理部を抽出する。ところが、ＧＰＵを用いて並列に動作させる場合は、ＣＰＵ-ＧＰＵメモリ間のデータやり取りオーバヘッドのため性能が出ないことも多い。ＧＰＵを用いて高速化する際は、スキル保持者が、OpenＣＬやＣＵＤＡでのチューニングや、ＰＧＩコンパイラ等で適切な並列処理部を探索することが必要になっている。for文が少ないベンチマークアプリケーションにて、各for文に対して、総当たりで並列処理するか否かを試行して性能測定を行い、最適な並列処理部の探索を行っている例もある（非特許文献２参照）。
このように、スキルが無いユーザがＧＰＵを使ってアプリケーションを高性能化することは難しいし、自動並列化技術を使う場合も、for文を並列するかしないかの試行錯誤チューニング等、利用開始までに多くの時間がかかっている。【００１８】
このような点に鑑みて本発明がなされたのであり、アプリケーションの特定処理をアクセラレータに自動でオフロードすることで、全体の処理能力を向上させることができるオフロードサーバおよびオフロードプログラムを提供することを課題とする。
【課題を解決するための手段】
【００１９】
前記した課題を解決するため、請求項１に記載の発明は、アプリケーションの特定処理をアクセラレータにオフロードするオフロードサーバであって、アプリケーションのソースコードを分析するアプリケーションコード分析部と、前記アプリケーションの繰り返し文を特定し、特定した各前記繰り返し文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部と、コンパイルエラーが出る繰り返し文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部と、前記並列処理パターンの前記アプリケーションをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部と、性能測定結果をもとに、複数の前記並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成する実行ファイル作成部と、を備えることを特徴とするオフロードサーバとした。【００２０】
このようにすることで、アプリケーションの特定処理をアクセラレータに自動でオフロードし、全体の処理能力を向上させることができる。これにより、例えばＣＵＤＡ等のスキルが無いユーザでもアクセラレータを使い高性能処理ができる。また、従来ＧＰＵでの高性能化が検討されていない汎用的なアクセラレータ向けアプリケーションを高性能化できる。また、高性能計算用サーバでない汎用的マシンのアクセラレータにオフロードすることができる。【００２１】
請求項２に記載の発明は、性能試験項目を格納するテストケースデータベースを有する記憶部と、ユーザ向けの本番環境に実行ファイルを配置後、テストケースデータベースから性能試験項目を抽出し、性能試験を実行する性能測定テスト抽出実行部と、を備えることを特徴とする請求項１に記載のオフロードサーバとした。【００２２】
このようにすることで、自動オフロードの性能試験を実行して、性能試験項目をテストすることができる。【００２３】
請求項３に記載の発明は、前記並列処理指定部が、前記アクセラレータにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出するオフロード範囲抽出部と、中間言語ファイルを出力する中間言語ファイル出力部と、を備え、前記性能測定部は、前記アクセラレータ検証用装置に、中間言語から導かれる実行ファイルを配置し、配置したバイナリファイルを前記アクセラレータ検証用装置に実行させ、オフロードした際の性能を測定させるとともに、性能測定結果を取得して、前記オフロード範囲抽出部に戻し、前記オフロード範囲抽出部は、別の前記並列処理パターンの抽出を行い、前記中間言語ファイル出力部は、抽出された中間言語をもとに、性能測定を試行し、前記実行ファイル作成部は、所定回数繰り返された、前記性能測定結果をもとに、複数の前記並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成することを特徴とする請求項１に記載のオフロードサーバとした。【００２４】
このようにすることで、オフロード処理に応じた中間言語を抽出し、中間言語ファイルを出力することで、中間言語から導かれる実行ファイルをデプロイすることができる。また、適切なオフロード領域探索のために中間言語抽出と実行ファイルのデプロイとを反復することができる。これにより、並列化を想定していない汎用プログラムから、自動で適切なオフロード領域を抽出することができる。【００２５】
請求項４に記載の発明は、前記実行ファイル作成部が、前記アプリケーションの実利用の間に、前記アクセラレータ検証用装置において性能測定を繰り返し行い、最高処理性能の並列処理パターンを選択し、最高処理性能の前記並列処理パターンをコンパイルして実行ファイルを作成し、所定のタイミングで、実利用環境に配置することを特徴とする請求項１に記載のオフロードサーバとした。【００２６】
このようにすることで、実際にユーザに提供する本番環境に、最高処理性能の実行ファイルをデプロイし、サービスとして提供することができる。【００２７】
請求項５に記載の発明は、前記並列処理指定部が、遺伝的アルゴリズムに基づき、コンパイルエラーが出ない繰り返し文の数を遺伝子長とし、前記並列処理パターン作成部は、アクセラレータ処理をする場合を１または０のいずれか一方、しない場合を他方の０または１として、アクセラレータ処理可否を遺伝子パターンにマッピングし、前記遺伝子の各値を１か０にランダムに作成した指定個体数の前記遺伝子パターンを準備し、前記性能測定部は、各個体に応じて、前記アクセラレータにおける並列処理指定文を指定したアプリケーションコードをコンパイルして、前記アクセラレータ検証用装置に配置し、前記アクセラレータ検証用装置において性能測定用処理を実行し、前記実行ファイル作成部は、全個体に対して、性能測定を行い、処理時間の短い個体ほど適合度が高くなるように評価し、全個体から、性能の高い個体を選択し、選択された個体に対して、交叉、突然変異の処理を行い、次世代の個体を作成し、指定世代数の処理終了後、最高性能の前記並列処理パターンを解として選択することを特徴とする請求項１に記載のオフロードサーバとした。【００２８】
このようにすることで、最初に並列可能な繰り返し文のチェックを行い、次に並列可能繰り返し文群に対してＧＡ（Genetic Algorithm：遺伝的アルゴリズム）を用いて検証環境で性能検証試行を反復し適切な領域を探索する。並列可能な繰り返し文（例えばfor文）に絞った上で、遺伝子の部分の形で、高速化可能な並列処理パターンを保持し組み換えていくことで、取り得る膨大な並列処理パターンから、効率的に高速化可能なパターンを探索できる。【００２９】
請求項６に記載の発明は、前記性能測定部が、途中世代で、以前と同じ前記並列処理パターンの遺伝子が生じた場合は、当該並列処理パターンに該当するアプリケーションコードのコンパイル、および、性能測定はせずに、性能測定値としては同じ値を使うことを特徴とする請求項５に記載のオフロードサーバとした。【００３０】
このようにすることで、以前と同じ遺伝子パターンのコンパイル、測定は省略されるため、処理時間を短縮することができる。【００３１】
請求項７に記載の発明は、前記性能測定部が、コンパイルエラーが生じるアプリケーションコード、および、性能測定が所定時間で終了しないアプリケーションコードについては、タイムアウトの扱いとして、性能測定値を所定の長時間に設定することを特徴とする請求項５に記載のオフロードサーバとした。【００３２】
このようにすることで、オフロードできる繰り返し文をできるだけ残しつつ、タイムアウト時間の調整により、処理時間を短縮することができる。【００３３】
請求項８に記載の発明は、コンピュータを、請求項１乃至請求項７のいずれか１項に記載のオフロードサーバとして機能させるためのオフロードプログラムとした。【００３４】
このようにすることにより、一般的なコンピュータを用いて、請求項１乃至請求項７のいずれか１項に記載のオフロードサーバの各機能を実現させることができる。
【発明の効果】
【００３５】
本発明によれば、アプリケーションの特定処理をアクセラレータに自動でオフロードすることで、全体の処理能力を向上させることができるオフロードサーバおよびオフロードプログラムを提供することができる。
【図面の簡単な説明】
【００３６】
【図１】本発明の実施形態に係るオフロードサーバを含むTacit Computingシステムを示す図である。
【図２】上記実施形態に係るオフロードサーバの構成例を示す機能ブロック図である。
【図３】上記実施形態に係るオフロードサーバのＧＡを用いた自動オフロード処理を示す図である。
【図４】上記実施形態に係るオフロードサーバのSimple GAによる制御部（自動オフロード機能部）の探索イメージを示す図であり、（ａ）は、処理の探索イメージを示す図、（ｂ）はfor文の遺伝子配列マッピングを示す図である。
【図５Ａ】上記実施形態に係るオフロードサーバの実装の動作概要を説明するフローチャートである。
【図５Ｂ】上記実施形態に係るオフロードサーバの実装の動作概要を説明するフローチャートである。
【図６】Tacit Computingの概要を説明するための図である。
【発明を実施するための形態】
【００３７】
次に、本発明を実施するための形態（以下、「本実施形態」と称する。）における、オフロードサーバ１等について説明する。
図１は、本実施形態に係るオフロードサーバ１を含むTacit Computingシステムを示す図である。
本実施形態に係るTacit Computingシステムは、図６に示した従来のTacit Computingの構成に加え、オフロードサーバ１を含むことを特徴とする。オフロードサーバ１は、アプリケーションの特定処理をアクセラレータにオフロードするオフロードサーバである。また、オフロードサーバ１は、クラウドレイヤ５０、ネットワークレイヤ６０、デバイスレイヤ７０の３層に位置する各装置と通信可能に接続される。
【００３８】
図６に示すような従来のTacit Computingによるシステムでは、デバイスをアドホックに発見し利用する際に、まずサービスを提供できることが前提となるため、コストや性能は考慮されない。しかしながら、サービスを継続的にかつリーズナブルに提供するためには、性能向上等を行うことによる運用コストの低減が必要となる。
【００３９】
Tacit Computingは、ユーザに適切なデバイスを発見し、利用する、OpenＩｏＴのコンセプトを一部実現している。しかし、Tacit Computingで即興的にデバイスを利用、連携する場合は、コスト等は度外視されている。例えば、上記の例が、マラソン大会ランナーのモニタでなく、街中カメラを使ったテロリストの監視や高齢者の見守りだった場合は、カメラ映像を画像分析するサービスを、継続的にリーズナブルに提供することが求められる。
【００４０】
そこで、本実施形態に係るオフロードサーバ１を含むTacit Computingシステムでは、デバイスレイヤ７０、ネットワークレイヤ６０、クラウドレイヤ５０のそれぞれのレイヤにおいて、機能配置や処理オフロードを適切に行うことによる効率化を実行する。主に、機能を３レイヤの適切な場所に配置し処理させる機能配置効率化と、画像分析等の機能処理をＧＰＵやＦＰＧＡ等のヘテロハードウェアにオフロードすることでの効率化を図る。クラウドレイヤ５０では、ＧＰＵやＦＰＧＡ等のヘトロジニアスなＨＷ（ハードウェア）（以下、「ヘトロデバイス」と称する。）を備えたサーバが増えてきている。例えば、Microsoft（登録商標）社のBing検索においても、ＦＰＧＡが利用されている。このように、へトロデバイスを活用し、例えば、行列計算等をＧＰＵにオフロードしたり、ＦＦＴ（Fast Fourier Transform）計算等の特定処理をＦＰＧＡにオフロードしたりすることで、高性能化を実現している。
【００４１】
以下、本実施形態に係るオフロードサーバ１が、Tacit Computingシステムにおけるユーザ向けサービス利用のバックグラウンドで行うオフロード処理を行う際の構成例について説明する。
上述したように、Tacit Computingシステムは、ユーザ要望に応じて適切なデバイスを利用し、アドホックにサービス化するものである。例えば、非特許文献１では、画像分析とネットワークカメラを用いて、対象パーソンを街中のカメラを切り替えて継続的にモニタする見守りサービスを実現している。このような場合、初日は試し利用等の形でユーザにサービス提供し、そのバックグラウンドで画像分析のオフロード処理を行い、翌日以降は画像分析をＧＰＵにオフロードしてリーズナブルな価格で見守りサービスを提供できるようにすることを想定する。
【００４２】
図２は、本発明の実施形態に係るオフロードサーバ１の構成例を示す機能ブロック図である。
オフロードサーバ１は、アプリケーションの特定処理をアクセラレータに自動的にオフロードする装置である。
図２に示すように、オフロードサーバ１は、制御部１１と、入出力部１２と、記憶部１３と、検証用マシン１４（Verification machine）(アクセラレータ検証用装置)と、を含んで構成される。
【００４３】
入出力部１２は、クラウドレイヤ、ネットワークレイヤおよびデバイスレイヤに属する各デバイス等との間で情報の送受信を行うための通信インタフェースと、タッチパネルやキーボード等の入力装置や、モニタ等の出力装置との間で情報の送受信を行うための入出力インタフェースとから構成される。
【００４４】
記憶部１３は、ハードディスクやフラッシュメモリ、ＲＡＭ（Random Access Memory）等により構成される。
この記憶部１３には、テストケースＤＢ（Test case database）ＤＢ１３１が記憶されるとともに、制御部１１の各機能を実行させるためのプログラム（オフロードプログラム）や、制御部１１の処理に必要な情報（例えば、中間言語ファイル(Intermediate file)１３２）が一時的に記憶される。
【００４５】
テストケースＤＢ１３１には、性能試験項目が格納される。テストケースＤＢ１３１は、性能試験項目に対応した、価格（例えば、ＩｏＴサービスの課金情報）、性能（アクセラレータの計算リソース）等のデータを格納する。
検証用マシン１４は、Tacit Computingの検証用環境として、ＧＰＵ・ＦＰＧＡ(アクセラレータ)を備える。
【００４６】
制御部１１は、オフロードサーバ１全体の制御を司る自動オフロード機能部（Automatic Offloading function）である。制御部１１は、例えば、記憶部１３に格納されたプログラム（オフロードプログラム）を不図示のＣＰＵ（Central Processing Unit）が、ＲＡＭに展開し実行することにより実現される。
【００４７】
制御部１１は、アプリケーションコード指定部（Specify application code）１１１と、アプリケーションコード分析部（Analyze application code）１１２と、並列処理指定部１１３と、並列処理パターン作成部１１４と、性能測定部１１５と、実行ファイル作成部１１６と、本番環境配置部（Deploy final binary files to production environment）１１７と、性能測定テスト抽出実行部（Extract performance test cases and  run automatically）１１８と、ユーザ提供部（Provide price and performance to a user to judge）１１９と、を備える。
【００４８】
<アプリケーションコード指定部１１１>
アプリケーションコード指定部１１１は、入力されたアプリケーションコードの指定を行う。具体的には、アプリケーションコード指定部１１１は、ユーザに提供しているサービスの処理機能（画像分析等）を特定する。
【００４９】
<アプリケーションコード分析部１１２>
アプリケーションコード分析部１１２は、処理機能のソースコードを分析し、ループ文やＦＦＴライブラリ呼び出し等の構造を把握する。
【００５０】
<並列処理指定部１１３>
並列処理指定部１１３は、アプリケーションの繰り返し文を特定し、各繰り返し文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする。
並列処理指定部１１３は、オフロード範囲抽出部（Extract offloadable area）１１３ａと、中間言語ファイル出力部（Output intermediate file）１１３ｂと、を備える。
【００５１】
オフロード範囲抽出部１１３ａは、ループ文やＦＦＴ等、ＧＰＵ・ＦＰＧＡにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出する。
【００５２】
中間言語ファイル出力部１１３ｂは、抽出した中間言語ファイル１３２を出力する。中間言語抽出は、一度で終わりでなく、適切なオフロード領域探索のため、実行を試行して最適化するため反復される。
【００５３】
<並列処理パターン作成部１１４>
並列処理パターン作成部１１４は、コンパイルエラーが出る繰り返し文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する。
【００５４】
<性能測定部１１５>
性能測定部１１５は、並列処理パターンのアプリケーションをコンパイルして、検証用マシン１４に配置し、アクセラレータにオフロードした際の性能測定用処理を実行する。
性能測定部１１５は、バイナリファイル配置部（Deploy binary files）１１５ａを備える。バイナリファイル配置部１１５ａは、ＧＰＵ・ＦＰＧＡを備えた検証用マシン１４に、中間言語から導かれる実行ファイルをデプロイ(配置)する。
【００５５】
性能測定部１１５は、配置したバイナリファイルを実行し、オフロードした際の性能を測定するとともに、性能測定結果を、オフロード範囲抽出部１１３ａに戻す。この場合、オフロード範囲抽出部１１３ａは、別の並列処理パターン抽出を行い、中間言語ファイル出力部１１３ｂは、抽出された中間言語をもとに、性能測定を試行する（後記図３の符号ｅ参照）。
【００５６】
<実行ファイル作成部１１６>
実行ファイル作成部１１６は、所定回数繰り返された、性能測定結果をもとに、複数の並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成する。
【００５７】
<本番環境配置部１１７> 
本番環境配置部１１７は、作成した実行ファイルを、ユーザ向けの本番環境に配置する（「最終バイナリファイルの本番環境への配置」）。本番環境配置部１１７は、最終的なオフロード領域を指定したパターンを決定し、ユーザ向けの本番環境にデプロイする。
【００５８】
<性能測定テスト抽出実行部１１８>
性能測定テスト抽出実行部１１８は、実行ファイル配置後、テストケースＤＢ１３１から性能試験項目を抽出し、性能試験を実行する（「最終バイナリファイルの本番環境への配置」）。
性能測定テスト抽出実行部１１８は、実行ファイル配置後、ユーザに性能を示すため、性能試験項目をテストケースＤＢ１３１から抽出し、抽出した性能試験を自動実行する。
【００５９】
<ユーザ提供部１１９>
ユーザ提供部１１９は、性能試験結果を踏まえた、価格・性能等の情報をユーザに提示する（「価格・性能等の情報のユーザへの提供」）。テストケースＤＢ１３１には、性能試験項目に対応した、価格、性能等のデータが格納されている。ユーザ提供部１１９は、テストケースＤＢ１３１に格納された試験項目に対応した、価格、性能等のデータを読み出して、上記性能試験結果と共にユーザに提示する。ユーザは、提示された価格・性能等の情報をもとに、ＩｏＴサービスの課金利用開始を判断する。ここで、本番環境への一括デプロイには、非特許文献３の既存技術を、また、性能自動試験には、非特許文献４の既存技術を用いればよい。
【００６０】
［遺伝的アルゴリズムの適用］
オフロードサーバ１は、オフロードの最適化にＧＡを用いることができる。ＧＡを用いた場合のオフロードサーバ１の構成は下記の通りである。
すなわち、並列処理指定部１１３は、遺伝的アルゴリズムに基づき、コンパイルエラーが出ない繰り返し文の数を遺伝子長とする。並列処理パターン作成部１１４は、アクセラレータ処理をする場合を１または０のいずれか一方、しない場合を他方の０または１として、アクセラレータ処理可否を遺伝子パターンにマッピングする。
【００６１】
並列処理パターン作成部１１４は、遺伝子の各値を１か０にランダムに作成した指定個体数の遺伝子パターンを準備し、性能測定部１１５は、各個体に応じて、アクセラレータにおける並列処理指定文を指定したアプリケーションコードをコンパイルして、検証用マシン１４に配置する。性能測定部１１５は、検証用マシン１４において性能測定用処理を実行する。
【００６２】
ここで、性能測定部１１５は、途中世代で、以前と同じ並列処理パターンの遺伝子が生じた場合は、当該並列処理パターンに該当するアプリケーションコードのコンパイル、および、性能測定はせずに、性能測定値としては同じ値を使う。
また、性能測定部１１５は、コンパイルエラーが生じるアプリケーションコード、および、性能測定が所定時間で終了しないアプリケーションコードについては、タイムアウトの扱いとして、性能測定値を所定の長時間に設定する。
【００６３】
実行ファイル作成部１１６は、全個体に対して、性能測定を行い、処理時間の短い個体ほど適合度が高くなるように評価する。実行ファイル作成部１１６は、全個体から、性能が高い個体を選択し、選択された個体に対して、交叉、突然変異の処理を行い、次世代の個体を作成する。実行ファイル作成部１１６は、指定世代数の処理終了後、最高性能の並列処理パターンを解として選択する。
【００６４】
以下、上述のように構成されたオフロードサーバ１の自動オフロード動作について説明する。
［自動オフロード動作］
本実施形態のオフロードサーバ１は、Tacit Computingの要素技術として、ユーザアプリケーションロジックの、ＧＰＵ自動オフロード技術に適用した例である。
図３は、オフロードサーバ１のＧＡを用いた自動オフロード処理を示す図である。
図３に示すように、オフロードサーバ１は、Tacit Computingの要素技術に適用される。オフロードサーバ１は、制御部（自動オフロード機能部）１１と、テストケースＤＢ１３１と、中間言語ファイル１３２と、検証用マシン１４と、を有している。
オフロードサーバ１は、ユーザが利用するアプリケーションコード（Application code）１３０を取得する。
【００６５】
ユーザは、OpenＩｏＴリソース（OpenＩｏＴResources）１５を利用する。OpenＩｏＴリソース１５は、例えば、各種デバイス（Device）１５１、ＣＰＵ-ＧＰＵを有する装置１５２、ＣＰＵ-ＦＰＧＡを有する装置１５３、ＣＰＵを有する装置１５４である。オフロードサーバ１は、機能処理をＣＰＵ-ＧＰＵを有する装置１５２、ＣＰＵ-ＦＰＧＡを有する装置１５３のアクセラレータに自動オフロードする。
【００６６】
以下、図３のステップ番号を参照して各部の動作を説明する。
<ステップＳ１１：Specify application code>
ステップＳ１１では、アプリケーションコード指定部１１１（図２参照）は、ユーザに提供しているサービスの処理機能（画像分析等）を特定する。具体的には、アプリケーションコード指定部１１１は、入力されたアプリケーションコードの指定を行う。
【００６７】
<ステップＳ１２：Analyze application code>
ステップＳ１２では、アプリケーションコード分析部１１２（図２参照）は、処理機能のソースコードを分析し、ループ文やＦＦＴライブラリ呼び出し等の構造を把握する。
【００６８】
<ステップＳ１３：Extract offloadable area>
ステップＳ１３では、並列処理指定部１１３（図２参照）は、アプリケーションの繰り返し文を特定し、各繰り返し文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする。具体的には、オフロード範囲抽出部１１３ａ（図２参照）は、ループ文やＦＦＴ等、ＧＰＵ・ＦＰＧＡにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出する。
【００６９】
<ステップＳ１４：Output intermediate file>
ステップＳ１４では、中間言語ファイル出力部１１３ｂ（図２参照）は、中間言語ファイル１３２を出力する。中間言語抽出は、一度で終わりでなく、適切なオフロード領域探索のため、実行を試行して最適化するため反復される。
【００７０】
<ステップＳ１５：Compile error>
並列処理パターン作成部１１４（図２参照）は、コンパイルエラーが出る繰り返し文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する。
【００７１】
<ステップＳ２１：Deploy binary files>
ステップＳ２１では、バイナリファイル配置部１１５ａ（図２参照）は、ＧＰＵ・ＦＰＧＡを備えた検証用マシン１４に、中間言語から導かれる実行ファイルをデプロイする。
【００７２】
<ステップＳ２２：Measure performances>
ステップＳ２２では、性能測定部１１５（図２参照）は、配置したファイルを実行し、オフロードした際の性能を測定する。
オフロードする領域をより適切にするため、この性能測定結果は、オフロード範囲抽出部１１３ａに戻され、オフロード範囲抽出部１１３ａは、別パターンの抽出を行い、中間言語ファイル出力部１１３ｂは、抽出された中間言語をもとに、性能測定を試行する（図３の符号ｅ参照）。
【００７３】
図３の符号ｅに示すように、制御部１１は、上記ステップＳ１２乃至ステップＳ２２を繰り返し実行する。制御部１１の自動オフロード機能をまとめると、下記である。すなわち、並列処理指定部１１３は、アプリケーションの繰り返し処理文を特定し、各繰返し文に対して、ＧＰＵでの並列処理指定文を指定して、コンパイルする。そして、並列処理パターン作成部１１４は、コンパイルエラーが出る繰り返し文は、オフロード対象外とし、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する。そして、バイナリファイル配置部１１５ａは、該当並列処理パターンのアプリケーションをコンパイルして、検証用マシン１４に配置し、性能測定部１１５は、検証用マシン１４で性能測定用処理を実行する。実行ファイル作成部１１６は、所定回数繰り返された、性能測定結果をもとに、複数の並列処理パターンから最高処理性能のパターンを選択し、選択パターンをコンパイルして実行ファイルを作成する。
【００７４】
<ステップＳ２３：Deploy final binary files to production environment>
ステップＳ２３では、本番環境配置部１１７は、最終的なオフロード領域を指定したパターンを決定し、ユーザ向けの本番環境にデプロイする。
【００７５】
<ステップＳ２４：Extract performance test cases and  run automatically>
ステップＳ２４では、性能測定テスト抽出実行部１１８は、実行ファイル配置後、ユーザに性能を示すため、性能試験項目をテストケースＤＢ１３１から抽出し、抽出した性能試験を自動実行する。
【００７６】
<ステップＳ２５：Provide price and performance to a user to judge>
ステップＳ２５では、ユーザ提供部１１９は、性能試験結果を踏まえた、価格・性能等の情報をユーザに提示する。ユーザは、提示された価格・性能等の情報をもとに、ＩｏＴサービスの課金利用開始を判断する。
【００７７】
上記ステップＳ１１〜ステップＳ２５は、ユーザのＩｏＴサービス利用のバックグラウンドで行われ、例えば、仮利用の初日の間に行う等を想定している。また、コスト低減のためにバックグラウンドで行う処理は、機能配置最適化とＧＰＵ・ＦＰＧＡオフロードのみを対象としてもよい。
【００７８】
上記したように、オフロードサーバ１の制御部（自動オフロード機能部）１１は、Tacit Computingの要素技術に適用した場合、機能処理のオフロードのため、ユーザが利用するアプリケーションのソースコードから、オフロードする領域を抽出して中間言語を出力する（ステップＳ１１〜ステップＳ１５）。自動オフロード機能部１１は、中間言語から導かれる実行ファイルを、検証用マシン１４に配置実行し、オフロード効果を検証する（ステップＳ２１〜ステップＳ２２）。検証を繰り返し、適切なオフロード領域を定めたのち、自動オフロード機能部１１は、実際にユーザに提供する本番環境に、実行ファイルをデプロイし、サービスとして提供する（ステップＳ２３〜ステップＳ２５）。
【００７９】
［ＧＡを用いたＧＰＵ自動オフロード］
ＧＰＵ自動オフロードは、ＧＰＵに対して、図３のステップＳ１２〜ステップＳ２２を繰り返し、最終的にステップＳ２３でデプロイするオフロードコードを得るための処理である。
【００８０】
ＧＰＵは、一般的にレイテンシーは保証しないが、並列処理によりスループットを高めることに向いたデバイスである。ＩｏＴで動作させるアプリケーションは、多種多様である。ＩｏＴデータの暗号化処理や、カメラ映像分析のための画像処理、大量センサデータ分析のための機械学習処理等が代表的であり、それらは、繰り返し処理が多い。そこで、アプリケーションの繰り返し文をＧＰＵに自動でオフロードすることでの高速化を狙う。
【００８１】
しかし、従来技術で記載の通り、高速化には適切な並列処理が必要である。特に、ＧＰＵを使う場合は、ＣＰＵとＧＰＵ間のメモリ転送のため、データサイズやループ回数が多くないと性能が出ないことが多い。また、メモリデータ転送のタイミング等により、並列高速化できる個々の繰り返し文（ループ文ともいう）の組み合わせが、最速とならない場合等がある。例えば、１０個のfor文（繰り返し文）で、１番、５番、１０番の３つがＣＰＵに比べて高速化できる場合に、１番、５番、１０番の３つの組み合わせが最速になるとは限らない等である。
【００８２】
適切な並列領域指定のため、ＰＧＩコンパイラを用いて、for文の並列可否を試行錯誤して最適化する試みがある。しかし、試行錯誤には多くの稼働がかかり、ＩｏＴサービスとして提供する際に、ユーザの利用開始が遅くなり、コストも上がってしまう問題がある。
【００８３】
そこで、本実施形態では、並列化を想定していない汎用プログラムから、自動で適切なオフロード領域を抽出する。このため、最初に並列可能for文のチェックを行い、次に並列可能for文群に対してＧＡを用いて検証環境で性能検証試行を反復し適切な領域を探索すること、を実現する。並列可能for文に絞った上で、遺伝子の部分の形で、高速化可能な並列処理パターンを保持し組み換えていくことで、取り得る膨大な並列処理パターンから、効率的に高速化可能なパターンを探索できる。
【００８４】
［Simple GAによる制御部（自動オフロード機能部）１１の探索イメージ］
図４は、Simple GAによる制御部（自動オフロード機能部）１１の探索イメージを示す図であり、（ａ）は、処理の探索イメージを示す図、（ｂ）はfor文の遺伝子配列マッピングを示す図である。
ＧＡは、生物の進化過程を模倣した組合せ最適化手法の一つである。ＧＡのフローチャートは、初期化→評価→選択→交叉→突然変異→終了判定となっている。
本実施形態では、ＧＡの中で、処理を単純にしたSimple GAを用いる。Simple GAは、遺伝子は１、０のみとし、ルーレット選択、一点交叉、突然変異は１箇所の遺伝子の値を逆にする等、単純化されたＧＡである。
【００８５】
<初期化>
初期化では、アプリケーションコードの全for文の並列可否をチェック後、並列可能for文を遺伝子配列にマッピングする。ＧＰＵ処理する場合は１、ＧＰＵ処理しない場合は０とする。遺伝子は、指定の個体数Ｍを準備し、１つのfor文にランダムに１、０の割り当てを行う。
具体的には、制御部（自動オフロード機能部）１１（図２参照）は、ユーザが利用するアプリケーションコード（Application code）１３０（図３参照）を取得し、図４（ａ）に示すように、アプリケーションコード１３０のコードパターン（Code patterns）１４１からfor文の並列可否をチェックする。図４（ｂ）に示すように、コードパターン１４１から５つのfor文が見つかった場合（図４の符号ｆ参照）、各for文に対して１桁、ここでは５つのfor文に対し５桁の１または０をランダムに割り当てる。例えば、ＣＰＵで処理する場合０、ＧＰＵに出す場合１とする。ただし、この段階では１または０をランダムに割り当てる。
遺伝子長に該当するコードが５桁であり、５桁の遺伝子長のコードは２５＝３２パターン、例えば１０００１、１００１０、…となる。なお、図４（ａ）では、コードパターン１４１中の丸印（○印）をコードのイメージとして示している。
【００８６】
<評価>
評価では、デプロイとパフォーマンスの測定（Deploy & performance measurement）を行う（図４の符号ｇ参照）。すなわち、性能測定部１１５（図２参照）は、遺伝子に該当するコードをコンパイルして検証用マシン１４にデプロイして実行する。性能測定部１１５は、ベンチマーク性能測定を行う。性能が良いパターン（並列処理パターン）の遺伝子の適合度を高くする。
【００８７】
<選択>
選択では、適合度に基づいて、高性能コードパターンを選択（Select high performance code patterns）する（図４の符号ｈ参照）。性能測定部１１５（図２参照）は、適合度に基づいて、高適合度の遺伝子を、指定の個体数選択する。本実施形態では、適合度に応じたルーレット選択および最高適合度遺伝子のエリート選択を行う。
図４（ａ）では、選択されたコードパターン（Select code patterns）１４２の中の丸印（○印）が、３つに減ったことを探索イメージとして示している。
【００８８】
<交叉>
交叉では、一定の交叉率Ｐｃで、選択された個体間で一部の遺伝子をある一点で交換し、子の個体を作成する。
ルーレット選択された、あるパターン（並列処理パターン）と他のパターンとの遺伝子を交叉させる。一点交叉の位置は任意であり、例えば上記５桁のコードのうち３桁目で交叉させる。
【００８９】
<突然変異>
突然変異では、一定の突然変異率Ｐｍで、個体の遺伝子の各値を０から１または１から０に変更する。
また、局所解を避けるため、突然変異を導入する。なお、演算量を削減するために突然変異を行わない態様でもよい。
【００９０】
<終了判定>
図４（ａ）に示すように、クロスオーバーと突然変異後の次世代コードパターンの生成（Generate next generation code patterns after crossover & mutation）を行う（図４の符号ｉ参照）。
終了判定では、指定の世代数Ｔ回、繰り返しを行った後に処理を終了し、最高適合度の遺伝子を解とする。
例えば、性能測定して、速い３つ１００１０、０１００１、００１０１を選ぶ。この３つをＧＡにより、次の世代は、組み換えをして、例えば新しいパターン（並列処理パターン）１０１０１（一例）を作っていく。このとき、組み換えをしたパターンに、勝手に０を１にするなどの突然変異を入れる。上記を繰り返して、一番早いパターンを見付ける。指定世代（例えば、２０世代）などを決めて、最終世代で残ったパターンを、最後の解とする。
【００９１】
<デプロイ（配置）>
最高適合度の遺伝子に該当する、最高処理性能の並列処理パターンで、本番環境に改めてデプロイして、ユーザに提供する。
【００９２】
<補足説明>
ＧＰＵにオフロードできないfor文（繰り返し文）が相当数存在する場合について説明する。例えば、for文が２００個あっても、ＧＰＵにオフロードできるものは３０個くらいである。ここでは、エラーになるものを除外し、この３０個について、ＧＡを行う。
【００９３】
OpenＡＣＣには、ディレクティブ #pragma acc kernelsで指定して、ＧＰＵ向けバイトコードを抽出し、実行によりＧＰＵオフロードを可能とするコンパイラがある。この#pragmaに、for文のコマンドを書くことにより、そのfor文がＧＰＵで動くか否かを判定することができる。
【００９４】
例えばC/C++を使った場合、C/C++のコードを分析し、for文を見付ける。for文を見付けると、OpenＡＣＣで並列処理の文法である#pragma acc kernelsを使ってfor文に対して書き込む。詳細には、何も入っていない#pragma acc kernels に、一つ一つfor文を入れてコンパイルして、エラーであれば、そのfor文はそもそも、ＧＰＵ処理できないので、除外する。このようにして、残るfor文を見付ける。そして、エラーが出ないものを、長さ（遺伝子長）とする。エラーのないfor文が５つであれば、遺伝子長は５であり、エラーのないfor文が１０であれば、遺伝子長は１０である。なお、並列処理できないものは、前の処理を次の処理に使うようなデータに依存がある場合である。
以上が準備段階である。次にＧＡ処理を行う。
【００９５】
for文の数に対応する遺伝子長を有するコードパターンが得られている。始めはランダムに並列処理パターン１００１０、０１００１、００１０１、…を割り当てる。ＧＡ処理を行い、コンパイルする。その時に、オフロードできるfor文であるにもかかわらず、エラーがでることがある。for文が階層になっている（どちらか指定すればＧＰＵ処理できる）場合である。この場合は、エラーとなったfor文は、残してもよい。具体的には、処理時間が多くなった形にして、タイムアウトさせる方法がある。
【００９６】
検証用マシン１４でデプロイして、ベンチマーク、例えば画像処理であればその画像処理でベンチマークする、その処理時間が短い程、適応度が高いと評価する。例えば、処理時間の逆数、処理時間１０秒かかるものは１、１００秒かかるものは０．１、１秒のものは１０とする。
適応度が高いものを選択して、例えば１０個のなかから、３〜５個を選択して、それを組み替えて新しいコードパターンを作る。作成途中で、前と同じものができる場合がある。この場合、同じベンチマークを行う必要はないので、前と同じデータを使う。本実施形態では、コードパターンと、その処理時間は記憶部１３に保存しておく。
【００９７】
以上で、Simple GAによる制御部（自動オフロード機能部）１１の探索イメージについて説明した。以下、オフロードサーバ１の実装を説明する。
【００９８】
［実装］
C/C++アプリケーションを汎用のＰＧＩコンパイラを用いて自動オフロードする実装を説明する。
C/C++言語は、ＯＳＳ（Open Source Software）およびproprietaryソフトウェアの開発で、上位の人気を誇り、数多くのアプリケーションがC/C++言語で開発されている。一般ユーザが用いるアプリケーションのオフロードを確認するため、暗号処理や画像処理等のＯＳＳの汎用アプリケーションを利用する。
【００９９】
ＧＰＵ処理は、ＰＧＩコンパイラにより行う。ＰＧＩコンパイラは、OpenＡＣＣを解釈するC/C++/Fortran向けコンパイラである。ＰＧＩコンパイラは、for文等の並列処理可能処理部を、OpenＡＣＣのディレクティブ #pragma acc kernels（並列処理指定文）で指定することにより、ＧＰＵ向けバイトコードを抽出し、実行によりＧＰＵオフロードを可能としている。さらに、for文内のデータ同士に依存性があり並列処理できない処理やネストのfor文の異なる複数の階層を指定されている場合等の際に、エラーを出す。
【０１００】
将来的に、ＦＰＧＡも統一的に扱う際は、OpenＣＬ等の共通的な中間言語を一度抽出し、ＦＰＧＡやＧＰＵ等のヘテロデバイスで実行することが必要となる。本実施形態では、オフロード部自動抽出に注力するため、ＧＰＵ処理自体は中間言語としてＣＵＤＡを用いたＰＧＩコンパイラに任せる。 
【０１０１】
<実装の動作概要>
実装の動作概要を説明する。
実装はPerl 5（Perlバージョン5）で行い、以下の処理を行う。
下記図５のフローの処理を開始する前に、高速化するC/C++アプリケーションとそれを性能測定するベンチマークツールを準備する。
【０１０２】
実装は、C/C++アプリケーションの利用依頼があると、まず、C/C++アプリケーションのコードを解析して、for文を発見し、カウントする。
【０１０３】
ＣＰＵ向け汎用アプリケーションは、並列化を想定して実装されているわけではない。そのため、まず、ＧＰＵ処理自体が不可なfor文は排除する必要がある。そこで、各for文一つずつに対して、並列処理の#pragma acc kernels ディレクティブ挿入を試行し、コンパイル時にエラーが出るかの判定を行う。コンパイルエラーに関しては、幾つかの種類がある。for文の中で外部ルーチンが呼ばれている場合、ネストfor文で異なる階層が重複指定されている場合、break等でfor文を途中で抜ける処理がある場合、for文のデータにデータ依存性がある場合等がある。アプリケーションによって、コンパイル時エラーの種類は多彩であり、これ以外の場合もあるが、コンパイルエラーは処理対象外とし、#pragmaディレクティブは挿入しない。
【０１０４】
コンパイルエラーは自動対処が難しく、また対処しても効果が出ないことも多い。外部ルーチンコールの場合は、#pragma acc routineにより回避できる場合があるが、多くの外部コールはライブラリであり、それを含めてＧＰＵ処理してもそのコールがネックとなり性能が出ない。for文一つずつを試行するため、ネストのエラーに関しては、コンパイルエラーは生じない。また、break等で途中で抜ける場合は、並列処理にはループ回数を固定化する必要があり、プログラム改造が必要となる。データ依存が有る場合はそもそも並列処理自体ができない。
【０１０５】
ここで、並列処理してもエラーが出ないループ文の数がａの場合、ａが遺伝子長となる。遺伝子の１は並列処理ディレクティブ有、０は無に対応させ、長さａの遺伝子に、アプリケーションコードをマッピングする。
【０１０６】
図５Ａ−Ｂは、実装の動作概要を説明するフローチャートであり、図５Ａと図５Ｂは、結合子で繋がれる。
C/C++向けOpenＡＣＣコンパイラを用いて以下の処理を行う。
【０１０７】
<コード解析>
ステップＳ１０１で、アプリケーションコード分析部１１２（図２参照）は、C/C++アプリのコード解析を行う。
【０１０８】
<ループ文特定>
ステップＳ１０２で、並列処理指定部１１３（図２参照）は、C/C++アプリのループ文を特定する。
制御部（自動オフロード機能部）１１は、ステップＳ１０３のループ始端とステップＳ１０６のループ終端間で、ステップＳ１０４−Ｓ１０５の処理についてループ文の数だけ繰り返す。
ステップＳ１０４で、並列処理指定部１１３は、各ループ文に対して、OpenＡＣＣで並列処理（#pragma acc kernels）を指定してコンパイルする。
ステップＳ１０５で、並列処理指定部１１３は、エラー時は、該当for文から、#pragma acc kernelsを除去する。
【０１０９】
ステップＳ１０７で、並列処理指定部１１３は、コンパイルエラーが出ないfor文の数をカウントし、遺伝子長とする。
<指定個体数パターン準備>
次に、初期値として、並列処理指定部１１３は、指定個体数の遺伝子配列を準備する。ここでは、０と１をランダムに割当てて作成する。
ステップＳ１０８で、並列処理指定部１１３は、C/C++アプリコードを、遺伝子にマッピングし、指定個体数パターン準備を行う。
準備された遺伝子配列に応じて、遺伝子の値が１の場合は並列処理を指定するディレクティブをC/C++コードに挿入する（例えば図４（ｂ）の#pragmaディレクティブ参照）。
【０１１０】
制御部（自動オフロード機能部）１１は、ステップＳ１０９のループ始端とステップＳ１１７のループ終端間で、ステップＳ１１０−Ｓ１１６の処理について指定世代数繰り返す。
また、上記指定世代数繰り返しにおいて、さらにステップＳ１１０のループ始端とステップＳ１１４のループ終端間で、ステップＳ１１１−Ｓ１１３の処理について指定個体数繰り返す。すなわち、指定世代数繰り返しの中で、指定個体数の繰り返しが入れ子状態で処理される。
ステップＳ１１１で、並列処理パターン作成部１１４（図２参照）は、遺伝子パターンに応じてディレクティブ指定したC/C++コードをＰＧＩコンパイラでコンパイルする。すなわち、並列処理パターン作成部１１４は、作成したC/C++コードを、ＧＰＵを備えた検証用マシン１４上のＰＧＩコンパイラでコンパイルを行う。
ここで、ネストfor文を複数並列指定する場合等でコンパイルエラーとなることがある。この場合は、性能測定時の処理時間がタイムアウトした場合と同様に扱う。
【０１１１】
ステップＳ１１２で、性能測定部１１５（図２参照）は、ＣＰＵ-ＧＰＵ搭載の検証用マシン１４に、実行ファイルをデプロイする。
【０１１２】
ステップＳ１１３で、性能測定部１１５は、配置したバイナリファイルを実行し、オフロードした際のベンチマーク性能を測定する。
ここで、途中世代で、以前と同じパターンの遺伝子については測定せず、同じ値を使う。つまり、ＧＡ処理の中で、以前と同じパターンの遺伝子が生じた場合は、その個体についてはコンパイルや性能測定をせず、以前と同じ測定値を用いる。
【０１１３】
ステップＳ１１５で、実行ファイル作成部１１６（図２参照）は、処理時間が短い個体ほど適合度が高くなるように評価し、性能の高い個体を選択する。
【０１１４】
ステップＳ１１６で、実行ファイル作成部１１６は、選択された個体に対して、交叉、突然変異の処理を行い、次世代の個体を作成する。次世代の個体に対して、コンパイル、性能測定、適合度設定、選択、交叉、突然変異処理を行う。
すなわち、全個体に対して、ベンチマーク性能測定後、ベンチマーク処理時間に応じて、各遺伝子配列の適合度を設定する。設定された適合度に応じて、残す個体の選択を行う。選択された個体に対して、交叉処理、突然変異処理、そのままコピー処理のＧＡ処理を行い、次世代の個体群を作成する。
【０１１５】
ステップＳ１１８で、実行ファイル作成部１１６は、指定世代数のＧＡ処理終了後、最高性能の遺伝子配列に該当するC/C++コード（最高性能の並列処理パターン）を解とする。
【０１１６】
<ＧＡのパラメータ>
上記、個体数、世代数、交叉率、突然変異率、適合度設定、選択方法は、ＧＡのパラメータである。ＧＡのパラメータは、例えば、以下のように設定してもよい。
実行するSimple GAの、パラメータ、条件は例えば以下のようにできる。
遺伝子長：並列可能ループ文数
個体数Ｍ：遺伝子長以下
世代数Ｔ：遺伝子長以下
適合度：(処理時間)(-1/2)
処理時間が短い程、高適合度になる。また、適合度を、処理時間の(-1/2)乗とすることで、処理時間が短い特定の個体の適合度が高くなり過ぎて、探索範囲が狭くなるのを防ぐことができる。また、性能測定が一定時間で終わらない場合は、タイムアウトさせ、処理時間１０００秒等の長時間であるとして、適合度を計算する。このタイムアウト時間は、性能測定特性に応じて変更させればよい。
選択：ルーレット選択
ただし、世代での最高適合度遺伝子は交叉も突然変異もせず次世代に保存するエリート保存も合わせて行う。
交叉率Ｐｃ：０．９
突然変異率Ｐｍ：０．０５
【０１１７】
<コストパフォーマンス>
自動オフロード機能のコストパフォーマンスについて述べる。
NVIDIA Tesla等の、ＧＰＵボードのハードウェアの価格だけを見ると、ＧＰＵを搭載したマシンの価格は、通常のＣＰＵのみのマシンの約２倍となる。しかし、一般にデータセンタ等のコストでは、ハードウェアやシステム開発のコストが１／３以下であり、電気代や保守・運用体制等の運用費が１／３超であり、サービスオーダ等のその他費用が１／３程度である。本実施形態では、暗号処理や画像処理等動作させるアプリケーションで時間がかかる処理を２倍以上高性能化できる。このため、サーバハードウェア価格自体は２倍となっても、コスト効果が十分に期待できる。
【０１１８】
<本番サービス利用開始までの時間>
本番サービス利用開始までの時間について述べる。
コンパイルから性能測定1回は３分程度とすると、２０の個体数、２０の世代数のＧＡで最大２０時間程度解探索にかかるが、以前と同じ遺伝子パターンのコンパイル、測定は省略されるため、８時間以下で終了する。多くのクラウドやホスティング、ネットワークサービスではサービス利用開始に半日程度かかるのが実情である。本実施形態では、例えば半日以内の自動オフロードが可能である。このため、半日以内の自動オフロードであれば、最初は試し利用ができるとすれば、ユーザ満足度を十分に高めることが期待できる。
【０１１９】
より短時間でオフロード部分を探索するためには、複数の検証用マシンで個体数分並列で性能測定することが考えられる。アプリケーションに応じて、タイムアウト時間を調整することも短時間化に繋がる。例えば、オフロード処理がＣＰＵでの実行時間の２倍かかる場合はタイムアウトとする等である。また、個体数、世代数が多い方が、高性能な解を発見できる可能性が高まる。しかし、各パラメータを最大にする場合、個体数×世代数だけコンパイル、および性能ベンチマークを行う必要がある。このため、本番サービス利用開始までの時間がかかる。本実施形態では、ＧＡとしては少ない個体数、世代数で行っているが、交叉率Ｐｃを０．９と高い値にして広範囲を探索することで、ある程度の性能の解を早く発見するようにしている。
【０１２０】
以上説明したように、本実施形態に係るオフロードサーバ１は、アプリケーションのソースコードを分析するアプリケーションコード分析部１１２と、アプリケーションの繰り返し文を特定し、各繰り返し文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部１１３と、コンパイルエラーが出る繰り返し文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部１１４と、を備える。また、並列処理パターンのアプリケーションをコンパイルして、検証用マシン１４に配置し、アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部１１５と、性能測定結果をもとに、複数の並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成する実行ファイル作成部１１６と、を備える。
【０１２１】
この構成により、アプリケーションの特定処理をアクセラレータに自動でオフロードすることで、全体の処理能力を向上させることができる。これにより、ＣＵＤＡ等のスキルが無いユーザでもＧＰＵを使い高性能処理ができる。また、従来ＧＰＵでの高性能化が検討されていない汎用的なＣＰＵ向けアプリケーションを高性能化できる。また、高性能計算用サーバでない汎用的マシンのＧＰＵにオフロードすることができる。
【０１２２】
さらに、Tacit Computing等の技術において、ユーザ向けにＩｏＴで汎用的に利用されるアプリケーション（暗号処理や画像処理等）を、ある程度の時間でアクセラレータにオフロードすることができる。これにより、ＣＰＵを動かす仮想マシン等のサーバ数を減らし、結果的にコストダウンを図ることができる。
例えば、図１に示すように、オフロードサーバ１は、３つのレイヤ（デバイスレイヤ、ネットワークレイヤ、クラウドレイヤ）の全てを考慮した上で、最適なレイヤに機能配置を行い、リソース確保することができる。これにより、ユーザが所望するサービスを、継続してリーズナブルに提供することができる。
【０１２３】
本実施形態に係るオフロードサーバ１は、作成した実行ファイルを、ユーザ向けの本番環境に配置する本番環境配置部１１７を備える。
【０１２４】
この構成により、ＣＵＤＡ等のスキルが無いユーザでもＧＰＵを使い高性能処理ができる。
【０１２５】
本実施形態に係るオフロードサーバ１は、性能試験項目を格納するテストケースデータベース１３１を有する記憶部１３と、実行ファイル配置後、テストケースＤＢ１３１から性能試験項目を抽出し、性能試験を実行する性能測定テスト抽出実行部１１８と、を備える。
【０１２６】
この構成により、自動オフロードの性能試験を実行して、性能試験項目をテストすることができる。
【０１２７】
本実施形態では、並列処理指定部１１３は、アクセラレータにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出するオフロード範囲抽出部１１３ａと、中間言語ファイル１３２を出力する中間言語ファイル出力部１１３ｂと、を備え、検証用マシン１４に、中間言語から導かれる実行ファイルを配置するバイナリファイル配置部１１５ａ、を備え、配置したバイナリファイルを実行し、オフロードした際の性能を測定するとともに、性能測定結果を、オフロード範囲抽出部１１３ａに戻し、オフロード範囲抽出部１１３ａは、別の並列処理パターン抽出を行い、中間言語ファイル出力部１１３ｂは、抽出された中間言語をもとに、性能測定を試行し、実行ファイル作成部１１６は、所定回数繰り返された、性能測定結果をもとに、複数の並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成する。
【０１２８】
この構成により、オフロード処理に応じた中間言語を抽出し、中間言語ファイルを出力することで、中間言語から導かれる実行ファイルをデプロイすることができる。また、適切なオフロード領域探索のために中間言語抽出と実行ファイルのデプロイとを反復することができる。これにより、並列化を想定していない汎用プログラムから、自動で適切なオフロード領域を抽出することができる。
【０１２９】
本実施形態では、実行ファイル作成部１１６は、アプリケーションの実利用の間に、検証用マシン１４において性能測定を繰り返し行い、最高処理性能の並列処理パターンを選択し、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成し、所定のタイミングで、実利用環境に配置する。
【０１３０】
この構成により、実際にユーザに提供する本番環境に、最高処理性能の実行ファイルをデプロイし、サービスとして提供することができる。よって、ユーザ満足度を高めることができる。
【０１３１】
本実施形態では、並列処理指定部１１３は、遺伝的アルゴリズムに基づき、コンパイルエラーが出ない繰り返し文の数を遺伝子長とし、並列処理パターン作成部１１４は、アクセラレータ処理する場合を１または０のいずれか一方、しない場合を他方の０または１として、アクセラレータ処理可否を遺伝子パターンにマッピングし、遺伝子の各値を１か０にランダムに作成した指定個体数の遺伝子パターンを準備し、性能測定部１１５は、各個体に応じて、アクセラレータにおける並列処理指定文を指定したアプリケーションコードをコンパイルして、検証用マシン１４に配置し、検証用マシン１４において性能測定用処理を実行し、実行ファイル作成部１１６は、全個体に対して、性能測定を行い、処理時間が短い個体ほど適合度が高くなるように評価し、全個体から、性能の高い個体を選択し、選択された個体に対して、交叉、突然変異の処理を行い、次世代の個体を作成し、指定世代数の処理終了後、最高性能の並列処理パターンを解として選択する。
【０１３２】
この構成により、最初に並列可能for文のチェックを行い、次に並列可能for文群に対してＧＡを用いて検証環境で性能検証試行を反復し適切な領域を探索する。並列可能for文に絞った上で、遺伝子の部分の形で、高速化可能な並列処理パターンを保持し組み換えていくことで、取り得る膨大な並列処理パターンから、効率的に高速化可能なパターンを探索できる。
【０１３３】
本実施形態では、性能測定部１１５は、途中世代で、以前と同じ並列処理パターンの遺伝子が生じた場合は、当該並列処理パターンに該当するアプリケーションコードのコンパイル、および、性能測定はせずに、性能測定値としては同じ値を使う。
【０１３４】
この構成により、以前と同じ遺伝子パターンのコンパイル、測定は省略されるため、処理時間を短縮することができる。
【０１３５】
本実施形態では、性能測定部１１５は、コンパイルエラーが生じるアプリケーションコード、および、性能測定が所定時間で終了しないアプリケーションコードについては、タイムアウトの扱いとして、性能測定値を所定の長時間に設定する。
【０１３６】
この構成により、オフロードできるfor文をできるだけ残しつつ、タイムアウト時間の調整により、処理時間を短縮することができる。
【０１３７】
なお、上記実施形態において説明した各処理のうち、自動的に行われるものとして説明した処理の全部又は一部を手作業で行うこともでき、あるいは、手作業で行われるものとして説明した処理の全部又は一部を公知の方法で自動的に行うこともできる。この他、上述文書中や図面中に示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。
【０１３８】
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、機能等は、プロセッサがそれぞれの機能を実現するプログラムを解釈し、実行するためのソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Solid State Drive）等の記録装置、又は、ＩＣ（Integrated Circuit）カード、ＳＤ（Secure Digital）カード、光ディスク等の記録媒体に保持することができる。
【０１３９】
また、本実施形態では、組合せ最適化問題を、限られた最適化期間中に解を発見できるようにするため、遺伝的アルゴリズム（ＧＡ）の手法を用いているが、最適化の手法はどのようなものでもよい。例えば、local search（局所探索法）、Dynamic Programming（動的計画法）、これらの組み合わせでもよい。
【０１４０】
また、本実施形態では、C/C++向けOpenＡＣＣコンパイラを用いているが、ＧＰＵ処理をオフロードできるものであればどのようなものでもよい。例えば、Java lambda（登録商標） GPU処理、IBM Java 9 SDK（登録商標）でもよい。なお、並列処理指定文は、これらの開発環境に依存する。
【０１４１】
また、本実施形態では、繰り返し文（ループ文）として、for文を例示したが、for文以外のwhile文やdo-while文も含まれる。ただし、ループの継続条件等を指定するfor文がより適している。
【符号の説明】
【０１４２】
１  オフロードサーバ
１０  ゲートウェイ
１１  制御部
１２  入出力部
１３  記憶部
１４  検証用マシン (アクセラレータ検証用装置)
１５  OpenＩｏＴリソース
２０  ネットワークエッジ
１１１  アプリケーションコード指定部
１１２  アプリケーションコード分析部
１１３  並列処理指定部
１１３ａ  オフロード範囲抽出部
１１３ｂ  中間言語ファイル出力部
１１４  並列処理パターン作成部
１１５  性能測定部
１１５ａ  バイナリファイル配置部
１１６  実行ファイル作成部
１１７  本番環境配置部
１１８  性能測定テスト抽出実行部
１１９  ユーザ提供部
１３０  アプリケーションコード
１３１  テストケースＤＢ
１３２  中間言語ファイル
１５１  各種デバイス
１５２  ＣＰＵ-ＧＰＵを有する装置
１５３  ＣＰＵ-ＦＰＧＡを有する装置
１５４  ＣＰＵを有する装置
【図１】
2019216127.tif 000003
【図２】
2019216127.tif 000004
【図３】
2019216127.tif 000005
【図４】
2019216127.tif 000006
【図５Ａ】
2019216127.tif 000007
【図５Ｂ】
2019216127.tif 000008
【図６】
2019216127.tif 000009
【国際調査報告】
2019216127.tif 000010
2019216127.tif 000011
2019216127.tif 000012
2019216127.tif 000013