JP7716632B2 - オフロードサーバ、オフロード制御方法およびオフロードプログラム - Google Patents
オフロードサーバ、オフロード制御方法およびオフロードプログラムInfo
- Publication number
- JP7716632B2 JP7716632B2 JP2023576454A JP2023576454A JP7716632B2 JP 7716632 B2 JP7716632 B2 JP 7716632B2 JP 2023576454 A JP2023576454 A JP 2023576454A JP 2023576454 A JP2023576454 A JP 2023576454A JP 7716632 B2 JP7716632 B2 JP 7716632B2
- Authority
- JP
- Japan
- Prior art keywords
- application program
- loop
- offload
- processing
- server
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/30—Monitoring
- G06F11/34—Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Description
このように、OpenCL、CUDA、OpenACC等の技術により、GPUやFPGAへのオフロード処理が可能になっている。
このため、スキルが無いユーザがGPUを使ってアプリケーションを高性能化することは難しいし、自動並列化技術を使う場合も、for文を並列するかしないかの試行錯誤チューニング等により、利用開始までに多くの時間がかかっている。
非特許文献2は、一度記述したコードで、配置先の環境に存在するGPUやFPGA、メニーコアCPU等を利用できるように、変換、リソース設定等を自動で行い、アプリケーションを高性能で動作させることを目的とした、環境適応ソフトウェアを提案している。併せて、非特許文献2は、環境適応ソフトウェアの要素として、アプリケーションコードのループ文を、GPUに自動オフロードする方式を提案し性能向上を評価している。
非特許文献4は、環境適応ソフトウェアの要素として、GPU等向けに自動変換した後、アプリケーションを実行するリソース量(仮想マシンコアの数など)を、適正化する手法を評価している。
GPU、FPGA等のヘテロジニアスなデバイスに処理をオフロードする際に、変換したアプリケーションをユーザ要望(価格、応答時間)を満たして動作させることについては提案されていないという課題がある。
(本発明の自動オフロードの基本的な考え方)
本発明者は、環境適応ソフトウェアのコンセプトを具体化するために、これまでに、プログラムのループ文のGPU自動オフロード、FPGA自動オフロード、変換アプリケーションの実行リソース適正化の方式を提案してきた(非特許文献2、3、4参照)。これら非特許文献2、3、4の要素技術の検討も踏まえて、本発明の基本的な考え方を述べる。
まず、デバイスにオフロードするプログラム変換ができた後の、CPUとオフロードデバイスのリソース比の適切化について説明する。
非特許文献2等の手法により、GPUやFPGA等のオフロードデバイスに通常のプログラムを自動オフロードすることができる。
現在、マルチコアCPU、メニーコアCPUは、仮想マシンやコンテナによる仮想化により、全コアの何割を割り当てる等が柔軟にできるようになっている。GPUについても、近年CPU同様の仮想化が行われ、GPUの全コアの何割を割り当てる等の運用が可能になりつつある。FPGAに関しては、リソース使用量は、Look Up TableやFlip Flopの設定数で表されることが多く、利用されていないゲートについては別用途に使うことができる。
次に、CPUとオフロードデバイスのリソース量(以下、「リソース量」という)の決定と自動検証について説明する。
上記<CPUとオフロードデバイスのリソース比の適切化>により、リソース比が定まった場合、次に商用環境へのアプリケーションの配置を行う。
商用環境への配置の際は、ユーザが指定したコスト要求を満たすように、リソース比は可能な限りキープ(維持)したまま、リソース量を決定する。例えば、CPUに関して、1VMは1000円/月、GPUは4000円/月、リソース比は2:1が適切であるとする。そして、ユーザの予算は、月10000円以内であると想定する。この場合には、リソース比を2:1としても、ユーザの予算内である月10000円以内に収まるので、適切なリソース比2:1をキープしたリソース量、すなわちCPUは「2」、GPUは「1」を確保して商用環境に配置することになる。また、ユーザの予算が、月5000円以内であった場合には、適切なリソース比2:1はキープできない。この場合、リソース量として、CPUは「1」、GPUは「1」を確保して配置する。
なお、GPUとCPUでは丸め誤差が異なる等、並列処理等を正しくオフロードしても完全に計算結果が一致しない場合もある。そのため、例えばIEEE 754仕様による確認等を行い、許容できる差分かをユーザに提示し、ユーザに確認をしてもらう。
本実施形態におけるリソース、リソース比、テストケース処理時間について述べる。
・リソースについて
CPU、GPU、FPGA等は仮想資源のインスタンスとして提供されるようになってきている。
リソースとして、CPUのコア数、クロック、メモリ量、ディスクサイズ、GPUのコア数、クロック、メモリ量、FPGAのゲート規模(Intel(登録商標)の場合はLE(登録商標)、Xilinx(登録商標)の場合LC(登録商標)が単位となる)がある。クラウド等の事業者は、それらをパッケージ化して、small sizeの仮想マシンやGPUインスタンスといった形で提供している。仮想化する場合は、利用するインスタンスの数が利用するリソース量といえる。
CPU、GPU、FPGAのインスタンス数の比がリソース比となる。インスタンス数が1つ、2つ、3つであれば、リソース比は1:2:3である。
本実施形態は、ユーザが指定するテストケースを高速化するオフロードパターンを探索して発見する。テストケースは、DB(データベース)であればTPC-C(登録商標)のようなトランザクション処理数であり、FFTであればサンプルデータでのフーリエ変換処理の実行である。処理時間は、そのサンプル処理を実行した際の実行時間である。例えば、処理Aの処理時間は、オフロード前は10秒であったものが、オフロード後は2秒になるといった形で、CPUで実行した場合と、オフロードデバイスで実行した場合との実行時間がそれぞれ取得される。
コンパイラが、このループ文はGPUの並列処理に適しているという適合性を見つけることは難しいのが現状である。GPUにオフロードすることでどの程度の性能、電力消費量になるかは、実測してみないと予測は難しい。そのため、このループ文をGPUにオフロードするという指示を手動で行い、測定の試行錯誤が行われている。
本発明は、GPUにオフロードする適切なループ文の発見を、進化計算手法である遺伝的アルゴリズム(GA:Genetic Algorithm)を用いて自動的に行う。すなわち、並列可能ループ文群に対して、GPU実行の際を1、CPU実行の際を0に値を置いて遺伝子化し、検証環境で反復測定し適切なパターンを探索する。
次に、本発明を実施するための形態(以下、「本実施形態」と称する。)における、オフロードサーバ1等について説明する。
図1は、本発明の第1の実施形態に係るオフロードサーバ1の構成例を示す機能ブロック図である。
オフロードサーバ1は、アプリケーションの特定処理をアクセラレータに自動的にオフロードする装置である。
図1に示すように、オフロードサーバ1は、制御部11と、入出力部12と、記憶部13と、検証用マシン14(Verification machine)(アクセラレータ検証用装置)と、を含んで構成される。
アプリケーションコード指定部111は、入力されたアプリケーションコードの指定を行う。具体的には、アプリケーションコード指定部111は、受信したファイルに記載されたアプリケーションコードを、アプリケーションコード分析部112に渡す。
アプリケーションコード分析部112は、処理機能のソースコードを分析し、ループ文やFFTライブラリ呼び出し等の構造を把握する。
データ転送指定部113は、アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行(後記する#pragma acc kernels、#pragma acc data copyin(a,b)、#pragma acc data copyout(a,b)、#prama acc parallel loop、#prama acc parallel loop vectorなど)を用いたデータ転送指定を行う。
並列処理指定部114は、アプリケーションプログラムのループ文(繰り返し文)を特定し、各ループ文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする。
並列処理指定部114は、オフロード範囲抽出部(Extract offload able area)114aと、中間言語ファイル出力部(Output intermediate file)114bと、を備える。
中間言語ファイル出力部114bは、抽出した中間言語ファイル133を出力する。中間言語抽出は、一度で終わりでなく、適切なオフロード領域探索のため、実行を試行して最適化するため反復される。
リソース比決定部115は、性能測定結果をもとに、CPUとオフロードデバイスの処理時間(テストケースCPU処理時間とオフロードデバイス処理時間)を、リソース比として決定する(後記)。具体的には、リソース比決定部115は、CPUとオフロードデバイスの処理時間が同等オーダになるように、リソース比を決定する。また、リソース比決定部115は、CPUとオフロードデバイスの処理時間の差分が所定閾値以上の場合、リソース比を所定の上限値に設定する。
リソース量設定部116は、決定したリソース比をもとに、所定のコスト条件を満たすように、CPUおよびオフロードデバイスのリソース量を設定する(後記)。具体的には、リソース量設定部116は、決定したリソース比を維持して、所定のコスト条件を満たす最大のリソース量を設定する。また、リソース量設定部116は、決定したリソース比を維持した最小リソース量の設定で所定のコスト条件を満たさない場合は、リソース比を崩してCPUとオフロードデバイスのリソース量をコスト条件を満たすより小さい値(例えば、最小)で設定する。
配置設定部170は、変換したアプリケーションを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションの配置場所を計算して設定する。具体的には、配置設定部170は、設備リソースDB132のサーバ、リンクのスペック情報、既存アプリケーションの配置情報に基づいて、線形計画手法で、新規アプリケーションの配置先(APLの配置場所)を計算して設定する。線形計画手法では、例えば、後記[数1][数2]に示す線形計画式の目的関数および制約条件を用いる。後記[数1][数2]に示す線形計画式は、設備リソースDB132に保存されており、配置設定部170が、設備リソースDB132から読み出し、配置設定部170が処理するメモリ上で展開される。
並列処理パターン作成部117は、コンパイルエラーが出るループ文(繰り返し文)に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する。
性能測定部118は、並列処理パターンのアプリケーションプログラムをコンパイルして、検証用マシン14に配置し、アクセラレータにオフロードした際の性能測定用処理を実行する。
性能測定部118は、バイナリファイル配置部(Deploy binary files)118aを備える。バイナリファイル配置部118aは、GPUやFPGAを備えた検証用マシン14に、中間言語から導かれる実行ファイルをデプロイ(配置)する。
実行ファイル作成部119は、所定回数繰り返された、性能測定結果をもとに、複数の並列処理パターンから高処理性能の並列処理パターンを複数選択し、高処理性能の並列処理パターンを交叉、突然変異処理により別の複数の並列処理パターンを作成する。そして、実行ファイル作成部119は、新たに性能測定までを行い、指定回数の性能測定後に、性能測定結果をもとに、複数の並列処理パターンから最高処理性能の並列処理パターンを選択し、最高処理性能の並列処理パターンをコンパイルして実行ファイルを作成する。
本番環境配置部120は、作成した実行ファイルを、ユーザ向けの本番環境に配置する(「最終バイナリファイルの本番環境への配置」)。本番環境配置部120は、最終的なオフロード領域を指定したパターンを決定し、ユーザ向けの本番環境にデプロイする。
性能測定テスト抽出実行部121は、実行ファイル配置後、テストケースDB131から性能試験項目を抽出し、性能試験を実行する(「最終バイナリファイルの本番環境への配置」)。
性能測定テスト抽出実行部121は、実行ファイル配置後、ユーザに性能を示すため、性能試験項目をテストケースDB131から抽出し、抽出した性能試験を自動実行する。
ユーザ提供部122は、性能試験結果を踏まえた、価格・性能等の情報をユーザに提示する(「価格・性能等の情報のユーザへの提供」)。テストケースDB131には、性能試験項目が格納されている。ユーザ提供部122は、テストケースDB131に格納された試験項目に対応した性能試験の実施結果に基づいて、価格、性能等のデータを、上記性能試験結果と共にユーザに提示する。ユーザは、提示された価格・性能等の情報をもとに、サービスの課金利用開始を判断する。ここで、本番環境への一括デプロイには、非特許文献7(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.1206/s13677-014-0007-3, 12 pages, June 2014.)の技術を、また、性能自動試験には、前述の非特許文献6の技術を用いればよい。
オフロードサーバ1は、オフロードの最適化にGA(Genetic Algorithms)を用いることができる。GAを用いた場合のオフロードサーバ1の構成は下記の通りである。
すなわち、並列処理指定部114は、遺伝的アルゴリズムに基づき、コンパイルエラーが出ないループ文(繰り返し文)の数を遺伝子長とする。並列処理パターン作成部117は、アクセラレータ処理をする場合を1または0のいずれか一方、しない場合を他方の0または1として、アクセラレータ処理可否を遺伝子パターンにマッピングする。
また、性能測定部118は、コンパイルエラーが生じるアプリケーションコード、および、性能測定が所定時間で終了しないアプリケーションコードについては、タイムアウトの扱いとして、性能測定値を所定の時間(長時間)に設定する。
[自動オフロード動作]
図2は、オフロードサーバ1を用いた自動オフロード処理を示す図である。
図2に示すように、オフロードサーバ1は、環境適応ソフトウェアの要素技術に適用される。オフロードサーバ1は、制御部(自動オフロード機能部)11と、テストケースDB131と、設備リソースDB132と、中間言語ファイル133と、検証用マシン14と、を有している。
オフロードサーバ1は、ユーザが利用するアプリケーションコード(Application code)125を取得する。
オフロードサーバ1は、機能処理をCPU-GPUを有する装置152、CPU-FPGAを有する装置153のアクセラレータに自動オフロードする。
<ステップS11:Specify application code>
ステップS11において、アプリケーションコード指定部111(図1参照)は、受信したファイルに記載されたアプリケーションコードを、アプリケーションコード分析部112に渡す。
ステップS12において、アプリケーションコード分析部112(図1参照)は、処理機能のソースコードを分析し、ループ文やFFTライブラリ呼び出し等の構造を把握する。
ステップS13において、並列処理指定部114(図1参照)は、アプリケーションのループ文(繰り返し文)を特定し、各繰り返し文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする。具体的には、オフロード範囲抽出部114a(図1参照)は、ループ文やFFT等、GPU・FPGAにオフロード可能な処理を特定し、オフロード処理に応じた中間言語を抽出する。
ステップS14において、中間言語ファイル出力部114b(図1参照)は、中間言語ファイル133を出力する。中間言語抽出は、一度で終わりでなく、適切なオフロード領域探索のため、実行を試行して最適化するため反復される。
ステップS15において、並列処理パターン作成部117(図1参照)は、コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する。
ステップS21において、バイナリファイル配置部118a(図1参照)は、GPU・FPGAを備えた検証用マシン14に、中間言語から導かれる実行ファイルをデプロイする。
ステップS22において、性能測定部118(図1参照)は、配置したファイルを実行し、オフロードした際の性能を測定する。
オフロードする領域をより適切にするため、この性能測定結果は、オフロード範囲抽出部114aに戻され、オフロード範囲抽出部114aが、別パターンの抽出を行う。そして、中間言語ファイル出力部114bは、抽出された中間言語をもとに、性能測定を試行する(図2の符号a参照)。
ステップS23において、制御部11は、ユーザ運用条件によるリソース量設定を行う。すなわち、制御部11のリソース比決定部115は、CPUとオフロードデバイスのリソース比を決定する。そして、リソース量設定部116は、決定したリソース比をもとに、設備リソースDB132の情報を参照し、ユーザ運用条件を満たすように、CPUおよびオフロードデバイスのリソース量を設定する(図10により後記する)。
ステップS24において、本番環境配置部120は、最終的なオフロード領域を指定したパターンを決定し、ユーザ向けの本番環境にデプロイする。
ステップS25において、性能測定テスト抽出実行部121は、実行ファイル配置後、ユーザに性能を示すため、性能試験項目をテストケースDB131から抽出し、抽出した性能試験を自動実行する。
ステップS26において、ユーザ提供部122は、性能試験結果を踏まえた、価格・性能等の情報をユーザに提示する。ユーザは、提示された価格・性能等の情報をもとに、サービスの課金利用開始を判断する。
GPU自動オフロードは、GPUに対して、図2のステップS12~ステップS22を繰り返し、最終的にステップS23でデプロイするオフロードコードを得るための処理である。
図3は、Simple GAによる制御部(自動オフロード機能部)11の探索イメージを示す図である。図3は、処理の探索イメージと、for文の遺伝子配列マッピングを示す。
GAは、生物の進化過程を模倣した組合せ最適化手法の一つである。GAのフローチャートは、初期化→評価→選択→交叉→突然変異→終了判定となっている。
本実施形態では、GAの中で、処理を単純にしたSimple GAを用いる。Simple GAは、遺伝子は1、0のみとし、ルーレット選択、一点交叉、突然変異は1箇所の遺伝子の値を逆にする等、単純化されたGAである。
初期化では、アプリケーションコードの全for文の並列可否をチェック後、並列可能for文を遺伝子配列にマッピングする。GPU処理する場合は1、GPU処理しない場合は0とする。遺伝子は、指定の個体数Mを準備し、1つのfor文にランダムに1、0の割り当てを行う。
具体的には、制御部(自動オフロード機能部)11(図1参照)は、ユーザが利用するアプリケーションコード(Application code)130(図2参照)を取得し、図3に示すように、アプリケーションコード130のコードパターン(Code patterns)141からfor文の並列可否をチェックする。図3に示すように、コードパターン141から5つのfor文が見つかった場合(図3の符号b参照)、各for文に対して1桁、ここでは5つのfor文に対し5桁の1または0をランダムに割り当てる。例えば、CPUで処理する場合0、GPUに出す場合1とする。ただし、この段階では1または0をランダムに割り当てる。
遺伝子長に該当するコードが5桁であり、5桁の遺伝子長のコードは25=32パターン、例えば10001、10010、…となる。なお、図3では、コードパターン141中の丸印(○印)をコードのイメージとして示している。
評価では、デプロイ(配置)とパフォーマンスの測定(Deploy & performance measurement)を行う(図3の符号c参照)。すなわち、性能測定部118(図1参照)は、遺伝子に該当するコードをコンパイルして検証用マシン14にデプロイして実行する。性能測定部118は、ベンチマーク性能測定を行う。性能が良いパターン(並列処理パターン)の遺伝子の適合度を高くする。
選択では、適合度に基づいて、高性能コードパターンを選択(Select high performance code patterns)する(図3の符号d参照)。性能測定部118(図1参照)は、適合度に基づいて、高適合度の遺伝子を、指定の個体数で選択する。本実施形態では、適合度に応じたルーレット選択および最高適合度遺伝子のエリート選択を行う。
図3では、選択されたコードパターン(Select code patterns)142の中の丸印(○印)が、3つに減ったことを探索イメージとして示している。
交叉では、一定の交叉率Pcで、選択された個体間で一部の遺伝子をある一点で交換し、子の個体を作成する。
ルーレット選択された、あるパターン(並列処理パターン)と他のパターンとの遺伝子を交叉させる。一点交叉の位置は任意であり、例えば上記5桁のコードのうち3桁目で交叉させる。
突然変異では、一定の突然変異率Pmで、個体の遺伝子の各値を0から1または1から0に変更する。
また、局所解を避けるため、突然変異を導入する。なお、演算量を削減するために突然変異を行わない態様でもよい。
図3に示すように、クロスオーバーと突然変異後の次世代コードパターンの生成(Generate next generation code patterns after crossover & mutation)を行う(図3の符号e参照)。
終了判定では、指定の世代数T回、繰り返しを行った後に処理を終了し、最高適合度の遺伝子を解とする。
例えば、性能測定して、速い3つ10010、01001、00101を選ぶ。この3つをGAにより、次の世代は、組み換えをして、例えば1番目と2番目を交叉させて新しいパターン(並列処理パターン)11011を作っていく。このとき、組み換えをしたパターンに、勝手に0を1にするなどの突然変異を入れる。上記を繰り返して、一番早いパターンを見付ける。指定世代(例えば、20世代)などを決めて、最終世代で残ったパターンを、最後の解とする。
最高適合度の遺伝子に該当する、最高処理性能の並列処理パターンで、本番環境に改めてデプロイして、ユーザに提供する。
GPUにオフロードできないfor文(ループ文;繰り返し文)が相当数存在する場合について説明する。例えば、for文が200個あっても、GPUにオフロードできるものは30個くらいである。ここでは、エラーになるものを除外し、この30個について、GAを行う。
以上が準備段階である。次にGA処理を行う。
適応度が高いものを選択して、例えば10個のなかから、3~5個を選択して、それを組み替えて新しいコードパターンを作る。このとき、作成途中で、前と同じものができる場合がある。その場合、同じベンチマークを行う必要はないので、前と同じデータを使う。本実施形態では、コードパターンと、その処理時間は記憶部13に保存しておく。
以上で、Simple GAによる制御部(自動オフロード機能部)11の探索イメージについて説明した。次に、データ転送の一括処理手法について述べる。
<基本的な考え方>
CPU-GPU転送の削減のため、ネストループの変数をできるだけ上位で転送することに加え、本発明は、多数の変数転送タイミングを一括化し、さらにコンパイラが自動転送してしまう転送を削減する。
転送の削減にあたり、ネスト単位だけでなく、GPUに転送するタイミングがまとめられる変数については一括化して転送する。例えば、GPUの処理結果をCPUで加工してGPUで再度処理させるなどの変数でなければ、複数のループ文で使われるCPUで定義された変数を、GPU処理が始まる前に一括してGPUに送り、全GPU処理が終わってからCPUに戻すなどの対応も可能である。
GPU処理の始まる前に一括化して転送され、ループ文処理のタイミングで転送が不要な変数はdata presentを用いて転送不要であることを明示する。
CPU-GPUのデータ転送時は、一時領域を作成し(#pragma acc declare create)、データは一時領域に格納後、一時領域を同期(#pragma acc update)することで転送を指示する。
まず、比較例について述べる。
比較例は、通常CPUプログラム(図4参照)、単純GPU利用(図5参照)、ネスト一括化(非特許文献2)(図6参照)である。なお、以下の記載および図中のループ文の文頭の<1>~<4>等は、説明の便宜上で付したものである(他図およびその説明においても同様)。
図4に示す通常CPUプログラムのループ文は、CPUプログラム側で記述され、
<1> ループ〔for(i=0; i<10; i++)〕{
}
の中に、
<2> ループ〔for(j=0; j<20; j++〕 {
がある。図4の符号fは、上記 <2>ループにおける、変数a,bの設定である。
また、
<3> ループ〔for(k=0; k<30; k++)〕{
}
と、
<4> ループ〔for(l=0; l<40; l++)〕{
}
と、が続く。図4の符号gは、上記<3>ループにおける変数c,dの設定であり、図4の符号hは、上記<4>ループにおける変数e,fの設定である。
図4に示す通常CPUプログラムは、CPUで実行される(GPU利用しない)。
図5に示す単純GPU利用のループ文は、CPUプログラム側で記述され、
<1> ループ〔for(i=0; i<10; i++)〕{
}
の中に、
<2> ループ〔for(j=0; j<20; j++〕 {
がある。
さらに、図5の符号iに示すように、 <1> ループ〔for(i=0; i<10; i++)〕{
}の上部に、PGIコンパイラによるfor文等の並列処理可能処理部を、OpenACCのディレクティブ #pragma acc kernels(並列処理指定文)で指定している。
図5の符号iを含む破線枠囲みに示すように、#pragma acc kernelsによって、CPUからGPUへデータ転送される。ここでは、このタイミングでa,bが転送されるため10回転送される。
}の上部に、PGIコンパイラによるfor文等の並列処理可能処理部を、OpenACCのディレクティブ #pragma acc kernelsで指定している。
図5の符号jを含む破線枠囲みに示すように、#pragma acc kernelsによって、このタイミングでc,dが転送される。
}の上部には、#pragma acc kernelsを指定しない。このループは、GPU処理しても効率が悪いのでGPU処理しない。
図6に示すループ文では、図6の符号kに示す位置に、CPUからGPUへのデータ転送指示行、ここでは変数a,bの copyin 節の #pragma acc data copyin(a,b)を挿入する。なお、本明細書では表記の関係でcopyin(a,b)について、括弧()を付している。後記copyout(a,b)、datacopyin(a,b,c,d)についても同様の表記方法を採る。
上記 #pragma acc data copyin(a,b)は、変数aの設定、定義を含まない最上位のループ(ここでは、 <1> ループ〔for(i=0; i<10; i++)〕{
}の上部)に指定される。
図6の符号kを含む一点鎖線枠囲みに示すタイミングでa,bが転送されるため1回転送が発生する。
上記 #pragma acc data copyout(a,b)は、 <1> ループ〔for(i=0; i<10; i++)〕{
}の下部に指定される。
次に、本実施形態について述べる。
《転送不要な変数をdata presentを用いて明示》
本実施形態では、複数ファイルで定義された変数について、GPU処理とCPU処理が入れ子にならず、CPU処理とGPU処理が分けられる変数については、一括化して転送する指定をOpenACCのdata copy文を用いて指定する。併せて、一括化して転送され、そのタイミングで転送が不要な変数はdata presentを用いて明示する。
図7に示すループ文では、図7の符号mに示す位置に、CPUからGPUへのデータ転送指示行、ここでは変数a,b,c,dの copyin 節の #pragma acc datacopyin(a,b,c,d)を挿入する。
上記 #pragma acc data copyin(a,b,c,d)は、変数aの設定、定義を含まない最上位のループ(ここでは、 <1> ループ〔for(i=0; i<10; i++)〕{
}の上部)に指定される。
図7の符号mを含む一点鎖線枠囲みに示すタイミングでa,b,c,dが転送されるため1回転送が発生する。
<1>、<3>のループがGPU処理されGPU処理が終了したタイミングで、GPUからCPUへのデータ転送指示行、ここでは変数a,b,c,dの copyout 節の #pragma acc datacopyout(a,b, c, d)を、図7の<3>ループが終了した位置pに挿入する。
図8は、本実施形態のCPU-GPUのデータ転送時の転送一括化によるループ文を示す図である。図8は、図7のネスト一括化および転送不要な変数明示に対応する。
図8に示すループ文では、図8の符号qに示す位置に、CPU-GPUのデータ転送時、一時領域を作成するOpenACCのdeclare create文#pragma acc declare createを指定する。これにより、CPU-GPUのデータ転送時は、一時領域を作成し(#pragma acc declare create)、データは一時領域に格納される。
上述したデータ転送の一括処理手法により、オフロードに適切なループ文を抽出し、非効率なデータ転送を避けることができる。
ただし、上記データ転送の一括処理手法を用いても、GPUオフロードに向いていないプログラムも存在する。効果的なGPUオフロードには、オフロードする処理のループ回数が多いことが必要である。
[実装]
C/C++アプリケーションを汎用のPGIコンパイラを用いて自動オフロードする実装を説明する。
本実装では、GPU自動オフロードの有効性確認が目的であるため、対象アプリケーションはC/C++言語のアプリケーションとし、GPU処理自体は、従来のPGIコンパイラを説明に用いる。
実装の動作概要を説明する。
実装は、以下の処理を行う。
下記図9A-Bのフローの処理を開始する前に、高速化するC/C++アプリケーションとそれを性能測定するベンチマークツールを準備する。
C/C++向けOpenACCコンパイラを用いて以下の処理を行う。
ステップS101で、アプリケーションコード分析部112(図1参照)は、C/C++アプリのコード解析を行う。
ステップS102で、並列処理指定部114(図1参照)は、C/C++アプリのループ文、参照関係を特定する。
ステップS103で、並列処理指定部114は、各ループ文のGPU処理可能性をチェックする(#pragma acc kernels)。
制御部(自動オフロード機能部)11は、ステップS104のループ始端とステップS117のループ終端間で、ステップS105-S116の処理についてループ文の数だけ繰り返す。
制御部(自動オフロード機能部)11は、ステップS105のループ始端とステップS108のループ終端間で、ステップS106-S107の処理についてループ文の数だけ繰り返す。
ステップS106で、並列処理指定部114は、各ループ文に対して、OpenACCでGPU処理(#pragma acc kernels)を指定してコンパイルする。
ステップS107で、並列処理指定部114は、エラー時は、次の指示句でGPU処理可能性をチェックする(#pragma acc parallel loop)。
制御部(自動オフロード機能部)11は、ステップS109のループ始端とステップS112のループ終端間で、ステップS110-S111の処理についてループ文の数だけ繰り返す。
ステップS110で、並列処理指定部114は、各ループ文に対して、OpenACCでGPU処理(#pragma acc parallel loop)を指定してコンパイルする。
ステップS111で、並列処理指定部114は、エラー時は、次の指示句でGPU処理可能性をチェックする(#pragma acc parallel loop vector)。
制御部(自動オフロード機能部)11は、ステップS113のループ始端とステップS116のループ終端間で、ステップS114-S115の処理についてループ文の数だけ繰り返す。
ステップS114で、並列処理指定部114は、各ループ文に対して、OpenACCでGPU処理(#pragma acc parallel loop vector)を指定してコンパイルする。
ステップS115で、並列処理指定部114は、エラー時は、当該ループ文からはGPU処理指示句を除去する。
ステップS118で、並列処理指定部114は、コンパイルエラーが出ないループ文(ここではfor文)の数をカウントし、遺伝子長とする。
次に、初期値として、並列処理指定部114は、指定個体数の遺伝子配列を準備する。ここでは、0と1をランダムに割当てて作成する。
ステップS119で、並列処理指定部114は、C/C++アプリコードを、遺伝子にマッピングし、指定個体数パターン準備を行う。
準備された遺伝子配列に応じて、遺伝子の値が1の場合は並列処理を指定するディレクティブをC/C++コードに挿入する(例えば図3の#pragmaディレクティブ参照)。
また、上記指定世代数繰り返しにおいて、さらにステップS121のループ始端とステップS126のループ終端間で、ステップS122-S125の処理について指定個体数繰り返す。すなわち、指定世代数繰り返しの中で、指定個体数の繰り返しが入れ子状態で処理される。
ステップS122で、データ転送指定部113は、変数参照関係をもとに、明示的指示行(#pragma acc data copy/copyin/copyout/presentおよび#pragam acc declarecreate, #pragma acc update)を用いたデータ転送指定を行う。
ステップS123で、並列処理パターン作成部117(図1参照)は、遺伝子パターンに応じてディレクティブ指定したC/C++コードをPGIコンパイラでコンパイルする。すなわち、並列処理パターン作成部117は、作成したC/C++コードを、GPUを備えた検証用マシン14上のPGIコンパイラでコンパイルを行う。
ここで、ネストfor文を複数並列指定する場合等でコンパイルエラーとなることがある。この場合は、性能測定時の処理時間がタイムアウトした場合と同様に扱う。
ステップS125で、性能測定部118は、配置したバイナリファイルを実行し、オフロードした際のベンチマーク性能を測定する。
すなわち、全個体に対して、ベンチマーク性能測定後、ベンチマーク処理時間に応じて、各遺伝子配列の適合度を設定する。設定された適合度に応じて、残す個体の選択を行う。実行ファイル作成部119は、選択された個体に対して、交叉処理、突然変異処理、そのままコピー処理のGA処理を行い、次世代の個体群を作成する。
上記、個体数、世代数、交叉率、突然変異率、適合度設定、選択方法は、GAのパラメータである。GAのパラメータは、例えば、以下のように設定してもよい。
実行するSimple GAの、パラメータ、条件は例えば以下のようにできる。
遺伝子長:並列可能ループ文数
個体数M:遺伝子長以下
世代数T:遺伝子長以下
適合度:(処理時間)(-1/2)
選択:ルーレット選択
ただし、世代での最高適合度遺伝子は交叉も突然変異もせず次世代に保存するエリート保存も合わせて行う。
交叉率Pc:0.9
突然変異率Pm:0.05
自動オフロード機能のコストパフォーマンスについて述べる。
NVIDIA Tesla等の、GPUボードのハードウェアの価格だけを見ると、GPUを搭載したマシンの価格は、通常のCPUのみのマシンの約2倍となる。しかし、一般にデータセンタ等のコストでは、ハードウェアやシステム開発のコストが1/3以下であり、電気代や保守・運用体制等の運用費が1/3超であり、サービスオーダ等のその他費用が1/3程度である。本実施形態では、暗号処理や画像処理等動作させるアプリケーションで時間がかかる処理を2倍以上高性能化できる。このため、サーバハードウェア価格自体は2倍となっても、コスト効果が十分に期待できる。
本番サービス利用開始までの時間について述べる。
コンパイルから性能測定1回は3分程度とすると、20の個体数、20の世代数のGAで最大20時間程度解探索にかかるが、以前と同じ遺伝子パターンのコンパイル、測定は省略されるため、8時間以下で終了する。多くのクラウドやホスティング、ネットワークサービスではサービス利用開始に半日程度かかるのが実情である。本実施形態では、例えば半日以内の自動オフロードが可能である。このため、半日以内の自動オフロードであれば、最初は試し利用ができるとすれば、ユーザ満足度を十分に高めることが期待できる。
本実施形態では、適用できるアプリケーション増加のため、指示句の拡大を行う。具体的には、GPU処理を指定する指示句として、kernels指示句に加えて,parallel loop指示句、parallel loop vector指示句にも拡大する。
OpenACC標準では、kernelsは、single loopやtightly nested loopに使われる。また、parallel loopは、non-tightly nested loopも含めたループに使われる。parallel loop vectorは、parallelizeはできないがvectorizeはできるループに使われる。ここで、tightly nested loopとは、ネストループにて、例えば、iとjをインクリメントする二つのループが入れ子になっている時、下位のループでiとjを使った処理がされ、上位ではされないような単純なループである。また、PGIコンパイラ等の実装においては、kernelsは、並列化の判断はコンパイラが行い、parallelは並列化の判断はプログラマが行うという違いがある。
ここで、parallel指示句にすることで、結果がkernelsの場合より信頼度が下がる懸念がある。しかし、最終的なオフロードプログラムに対して、サンプルテストを行い、CPUとの結果差分をチェックしその結果をユーザに見せて、ユーザに確認してもらうことを想定している。そもそも、CPUとGPUではハードが異なるため,有効数字桁数や丸め誤差の違い等があり、kernelsだけでもCPUとの結果差分のチェックは必要である。
図10は、GPUオフロード試行の後に追加されるリソース比とリソース量の設定および新規アプリケーションの配置を説明するフローチャートである。図10に示すフローチャートは、図9A-Bに示すGPUオフロード試行後に実行される。
ステップS52でリソース比決定部115は、性能測定結果をもとに、CPUとオフロードデバイスの処理時間(テストケースCPU処理時間とオフロードデバイス処理時間)の比を、リソース比として決定する。
ステップS53でリソース量設定部116は、ユーザ運用条件と適切リソース比をもとに、リソース量を設定する。すなわち、リソース量設定部116は、ユーザが指定したコスト条件を満たすように、リソース比はできるだけキープして、リソース量を決定する。
リソース比を適切化するため、オフロードパターンの解を決める際の性能測定結果を用いる。実装は、テストケースの処理時間から、CPUとGPUの処理時間が同等オーダになるようリソース比を定める。例えば、テストケースの処理時間が、CPU処理:10秒、GPU処理:5秒の場合では、CPU側のリソースは2倍で同等の処理時間程度と考えられるため、リソース比は2:1となる。なお、仮想マシン等の数は整数となるため、リソース比は処理時間から計算する際に、整数比となるように四捨五入する。
リソース量を設定すると、実装では、例えばXen Serverの仮想化機能を用いて、CPUやGPUのリソースを割り当てる。
本実施形態のオフロードサーバ1は、CPU向けプログラムを、GPU等のデバイスにオフロードした際に、アプリケーションをユーザのコスト等要求を満たして、応答時間等を短く動作するように、配置先を適正化する。
本実施形態では、アプリケーションはクラウドだけでなく、ネットワークエッジやユーザエッジに配置できることを前提とする。ただし、ネットワークエッジやユーザエッジは、クラウドに比べサーバの集約度が低く分散している。このため、計算リソースのコストは、クラウドに比べ割高となる。すなわち、一般にCPUやGPU等のハードウェアの価格は配置場所によらず一定であるものの、クラウドを運用するデータセンタでは集約されたサーバをまとめて監視や空調制御等できるため、運用費が割安となる。
例えば、計算ノードリンクの簡単なトポロジーとしては、図11が挙げられる。
IoT等のアプリケーションを想定してインプットノードからIoTデータ(IoTデバイスの一つである花粉センサや体温センサ等)がユーザエッジに収集され、アプリケーションの特性(応答時間の要求条件等)に応じて、ユーザエッジ、キャリアエッジで分析処理がされたり、クラウドまでデータをあげてから分析処理されたりされる。アウトプットノードは「1」(n15)であり、分析結果を会社の幹部が見る。例えば、インプットノードがIoTデータ(花粉センサ)の場合は、アウトプットノードの統計・分析結果は気象庁の責任者が確認する。
図11に示す配置トポロジー3層は、一例であり、例えば5層であってもよい。また、ユーザエッジ、キャリアエッジの数は、実際には数十~数百の場合もある。
一つ目は、コスト要求であり、アプリケーションを動作させるために許容できる計算リソースのコストを指定する形で、例えば月5000円以内で動作させる等である。二つ目は、応答時間要求であり、アプリケーションを動作させる際の許容応答時間を指定する形で、例えば10秒以内に応答を返す等である。従来から行われている設備設計では、例えば仮想ネットワークを収容するサーバを配置する場所を、トラフィック増加量等の長期的傾向を見て、計画的に設計している。
(2)キャリアの設備コストや全体的応答時間だけを低減すればよいのではなく、計算リソースのコストや応答時間に対する個々のユーザ要求を満たす必要がある。また、アプリケーションの配置ポリシーも動的に変わり得る。
本実施形態では、アプリケーションの適切な配置場所を計算するための、線形計画手法の定式化を行う。線形計画手法は、具体的には、[式1](以下の式(1)~式(4))、[式2](以下の式(3)~式(6))に示す線形計画式のパラメータを用いる。
ユーザ要求が計算リソースのコスト要求であるかまたは応答時間要求であるかで、線形計画式のパラメータにおける、目的関数と制約条件が変わる。
コスト要求により、一月幾ら以内での配置が必要な要求の場合は、下記[式1]に示す線形計画式のパラメータを用いる。
応答時間要求により、アプリケーションの応答時間が何秒以内での配置が必要な要求の場合は、下記[式2]に示す線形計画式のパラメータを用いる。
式(1)および式(6)は、アプリケーションkの応答時間を計算するための式であり、式(1)の場合はRkが目的関数、式(6)の場合はRkがユーザが指定した上限を設定する制約条件である。
ここで、アプリケーションプログラムの配置は、順次行われるため早い者勝ちと言えるが、アプリケーション100個毎等、定期的に、既に配置済みのアプリケーションプログラム群の適正配置を再計算する。そして、ユーザの指定するコスト、応答時間に応じて、目的関数が極小化される配置を計算し、計算で定まった位置に、アプリケーションを再配置してもよい。
線形計画手法の一態様である線形計画式に基づき、無償ソルバのGLPK(登録商標)を用いて、複数のアプリケーションが適切に配置されていくことを、いくつかの条件を変更して確認した。
・対象アプリケーション
配置対象のアプリケーションは、多くのユーザが利用すると想定されるフーリエ変換による画像処理をする。フーリエ変換処理(FFT)は、振動周波数の分析等、IoTでのモニタリングの様々な場面で利用されている。
NAS.FT(https://www.nas.nasa.gov/publications/npb.html)(登録商標)は、FFT処理のオープンソースアプリケーションの一つである。備え付けのサンプルテストの2048×2048サイズの計算を行う。IoTで、デバイスからデータをネットワーク転送するアプリケーションについて想定した際に、ネットワークコストを下げるため、デバイス側でFFT 処理等の一次分析をして送ることが想定される。
本実施形態のGPU、FPGA自動オフロード技術により、NAS.FTはGPUで高速化でき、MRI-QはFPGAで高速化でき、それぞれ、CPUに比べて5倍、7倍の高速化ができる。
アプリケーションを配置するトポロジーは、図11に示すように3層で構成され、クラウドレイヤーの拠点数は「5」、キャリアエッジレイヤーは「20」、ユーザエッジレイヤーは「60」、インプットノードは「300」とする。IoT等のアプリケーションを想定してインプットノードからIoTデータ等がユーザエッジに収集され、アプリケーションの特性(応答時間の要求条件等)に応じて、ユーザエッジ、キャリアエッジで分析処理がされたり、クラウドまでデータをあげてから分析処理されたりされる。
例えば、配置依頼数として、NAS.FT:MRI-Q=3:1の割合で1000回アプリを配置依頼する。また、ユーザ要求として、配置依頼する際にアプリ毎に価格条件か応答時間条件が選ばれる。NAS.FTの場合、価格に関しては月7000円上限か8500円上限か10000円上限、応答時間に関しては6秒上限か7秒条件か10秒上限が選択される。MRI-Qの場合、価格に関しては月12500円上限か20000円上限、応答時間に関しては、4秒上限か8秒上限が選択される。
パターン1:NAS.FTでは6種のリクエストを1/6ずつ、MRI-Qでは4種のリクエストを1/4ずつ選択する。
パターン2:リクエストは最低価格が上限の条件を選択(最初は7000円、12500円)し、空きがない場合は次に安い価格条件とする。
パターン3:リクエストは最低応答時間が上限の条件を選択(最初は6秒、4秒)し、空きがない場合は次に速い応答時間条件とする。
配置は、評価ツールとしてソルバGLPK5.0(登録商標)を用いてシミュレーション実験により行う。規模のあるネットワーク配置の模擬のため、評価ツールを用いたシミュレーションになる。実利用の際は、アプリケーションのオフロード依頼が来た場合、検証環境を用いた繰返し性能試験でオフロードパターンを作成し、検証環境での性能試験結果に基づいて適切なリソース量を決める(図10参照)。そして、ユーザ要望に応じてGLPK等を用いて適切な配置を定め、実際にデプロイした際の正常確認試験や性能試験を自動で行い、その結果と価格をユーザに提示して、ユーザ判断後利用を開始する。
パターン2ではクラウドから順に、パターン3ではエッジから順に埋まっていくことが確認できた。パターン1では、多様な依頼が来た場合に、ユーザ要求条件を満たして配置される。
図12に示すように、パターン2では、400配置位までは全てクラウドに配置され平均応答時間は最遅のままであるが、クラウドが埋まると段々下がっていくことが分かる。
パターン3では、NAS.FTはユーザエッジから、またMRI-Qはキャリアエッジから配置される。このため、平均応答時間については最短となる。しかし、数が増えるとクラウドにも配置されるため平均応答時間は遅くなる。パターン2では、平均応答時間は、パターン1やパターン3の中間であり、ユーザ要求に応じて配置される。このため、パターン2では、最初はクラウドに全て入るパターン1に比べて平均応答時間は適切に低減されている。
次に、本発明の第2実施形態における、オフロードサーバ1A等について説明する。
第2実施形態は、ループ文のFPGA自動オフロードに適用した例である。
本実施形態は、PLD(Programmable Logic Device)として、FPGA(Field Programmable Gate Array)に適用した例について説明する。本発明は、プログラマブルロジックデバイス全般に適用可能である。
FPGAで、どのループをオフロードすれば高速になるかの予測は難しいため、GPU同様検証環境で自動測定することを提案している。しかし、FPGAは、OpenCLをコンパイルして実機で動作させるまで数時間以上かかるため、GPU自動オフロードでのGAを用いて何回も反復して測定することは、処理時間が膨大となり行うことはできない。そこで、FPGAにオフロードする候補のループ文を絞ってから、測定を行う形をとる。具体的には、発見されたループ文に対して、ROSE(登録商標)等の算術強度分析ツールを用いて算術強度が高いループ文を抽出する。更に、gcov(登録商標)等のプロファイリングツールを用いてループ回数が多いループ文も抽出する。
候補ループ文が幾つか残るため、それらを用いて性能や電力使用量を実測する。選択された単ループ文に対してコンパイルして測定し、更に高速化できた単ループ文に対してはその組み合わせパターンも作り2回目の測定をする。測定された複数パターンの中で、短時間かつ低電力使用量のパターンを解として選択する。
オフロードサーバ1Aは、アプリケーションの特定処理をアクセラレータに自動的にオフロードする装置である。
また、オフロードサーバ1Aは、エミュレータに接続可能である。
図13に示すように、オフロードサーバ1Aは、制御部21と、入出力部12と、記憶部13と、検証用マシン14(Verification machine)(アクセラレータ検証用装置)と、を含んで構成される。
PLD処理指定部213は、アプリケーションのループ文(繰り返し文)を特定し、特定した各ループ文に対して、PLDにおけるパイプライン処理、並列処理をOpenCLで指定した複数のオフロード処理パターンを作成してコンパイルする。
PLD処理指定部213は、オフロード範囲抽出部(Extract offload able area)213aと、中間言語ファイル出力部(Output intermediate file)213bと、を備える。
算術強度算出部214は、例えばROSEフレームワーク(登録商標)等の算術強度(Arithmetic Intensity)分析ツールを用いて、アプリケーションのループ文の算術強度を算出する。算術強度は、プログラムの稼働中に実行した浮動小数点演算(floating point number,FN)の数を、主メモリへのアクセスしたbyte数で割った値(FN演算/メモリアクセス)である。
算術強度は、計算回数が多いと増加し、アクセス数が多いと減少する指標であり、算術強度が高い処理はプロセッサにとって重い処理となる。そこで、算術強度分析ツールで、ループ文の算術強度を分析する。PLD処理パターン作成部215は、算術強度が高いループ文をオフロード候補に絞る。
1回のループの中での浮動小数点計算処理が10回(10FLOP)行われ、ループの中で使われるデータが2byteであるとする。ループ毎に同じサイズのデータが使われる際は、10/2=5 [FLOP/byte]が算術強度となる。
なお、算術強度では、ループ回数が考慮されないため、本実施形態では、算術強度に加えて、ループ回数も考慮して絞り込む。
PLD処理パターン作成部215は、算術強度算出部214が算出した算術強度をもとに、算術強度が所定の閾値より高い(以下、適宜、高算術強度という)ループ文をオフロード候補として絞り込み、PLD処理パターンを作成する。
また、PLD処理パターン作成部215は、基本動作として、コンパイルエラーが出るループ文(繰り返し文)に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、PLD処理するかしないかの指定を行うPLD処理パターンを作成する。
PLD処理パターン作成部215は、ループ回数測定機能として、プロファイリングツールを用いてアプリケーションのループ文のループ回数を測定し、ループ文のうち、高算術強度で、ループ回数が所定の回数より多い(以下、適宜、高ループ回数という)ループ文を絞り込む。ループ回数把握には、GNUカバレッジのgcov等を用いる。プロファイリングツールとしては、「GNUプロファイラ(gprof)」、「GNUカバレッジ(gcov)」が知られている。双方とも各ループの実行回数を調査できるため、どちらを用いてもよい。
PLD処理パターン作成部215は、OpenCL作成機能として、絞り込まれた各ループ文をFPGAにオフロードするためのOpenCLを作成(OpenCL化)する。すなわち、PLD処理パターン作成部215は、絞り込んだループ文をオフロードするOpenCLをコンパイルする。また、PLD処理パターン作成部215は、性能測定された中でCPUに比べ高性能化されたループ文をリスト化し、リストのループ文を組み合わせてオフロードするOpenCLを作成する。
PLD処理パターン作成部215は、ループ文をOpenCL等の高位言語化する。まず、CPU処理のプログラムを、カーネル(FPGA)とホスト(CPU)に、OpenCL等の高位言語の文法に従って分割する。例えば、10個のfor文の内一つのfor文をFPGAで処理する場合は、その一つをカーネルプログラムとして切り出し、OpenCLの文法に従って記述する。OpenCLの文法例については、後記する。
ホストコードで記述するOpenCLの初期化、実行、終了の基本フローは、下記ステップ1~13である。このステップ1~13のうち、ステップ1~10がカーネル関数hello()をホスト側から呼び出すまでの手続(準備)であり、ステップ11でカーネルの実行となる。
OpenCLランタイムAPIで定義されているプラットフォーム特定機能を提供する関数clGetPlatformIDs()を用いて、OpenCLが動作するプラットフォームを特定する。
OpenCLランタイムAPIで定義されているデバイス特定機能を提供する関数clGetDeviceIDs()を用いて、プラットフォームで使用するGPU等のデバイスを特定する。
OpenCLランタイムAPIで定義されているコンテキスト作成機能を提供する関数clCreateContext()を用いて、OpenCLを動作させる実行環境となるOpenCLコンテキストを作成する。
OpenCLランタイムAPIで定義されているコマンドキュー作成機能を提供する関数clCreateCommandQueue()を用いて、デバイスを制御する準備であるコマンドキューを作成する。OpenCLでは、コマンドキューを通して、ホストからデバイスに対する働きかけ(カーネル実行コマンドやホスト-デバイス間のメモリコピーコマンドの発行)を実行する。
OpenCLランタイムAPIで定義されているデバイス上にメモリを確保する機能を提供する関数clCreateBuffer()を用いて、ホスト側からメモリオブジェクトを参照できるようにするメモリオブジェクトを作成する。
デバイスで実行するカーネルは、その実行自体をホスト側のプログラムで制御する。このため、ホストプログラムは、まずカーネルプログラムを読み込む必要がある。カーネルプログラムには、OpenCLコンパイラで作成したバイナリデータや、OpenCL C言語で記述されたソースコードがある。このカーネルファイルを読み込む(記述省略)。なお、カーネルファイル読み込みでは、OpenCLランタイムAPIは使用しない。
OpenCLでは、カーネルプログラムをプログラムプロジェクトとして認識する。この手続きがプログラムオブジェクト作成である。
OpenCLランタイムAPIで定義されているプログラムオブジェクト作成機能を提供する関数clCreateProgramWithSource()を用いて、ホスト側からメモリオブジェクトを参照できるようにするプログラムオブジェクトを作成する。カーネルプログラムのコンパイル済みバイナリ列から作成する場合は、clCreateProgramWithBinary()を使用する。
ソースコードとして登録したプログラムオブジェクトを OpenCL Cコンパイラ・リンカを使いビルドする。
OpenCLランタイムAPIで定義されているOpenCL Cコンパイラ・リンカによるビルドを実行する関数clBuildProgram()を用いて、プログラムオブジェクトをビルドする。なお、clCreateProgramWithBinary()でコンパイル済みのバイナリ列からプログラムオブジェクトを生成した場合、このコンパイル手続は不要である。
OpenCLランタイムAPIで定義されているカーネルオブジェクト作成機能を提供する関数clCreateKernel()を用いて、カーネルオブジェクトを作成する。1つのカーネルオブジェクトは、1つのカーネル関数に対応するので、カーネルオブジェクト作成時には、カーネル関数の名前(hello)を指定する。また、複数のカーネル関数を1つのプログラムオブジェクトとして記述した場合、1つのカーネルオブジェクトは、1つのカーネル関数に1対1で対応するので、clCreateKernel()を複数回呼び出す。
OpenCLランタイムAPIで定義されているカーネルへ引数を与える(カーネル関数が持つ引数へ値を渡す)機能を提供する関数clSetKernel()を用いて、カーネル引数を設定する。
以上、上記ステップ1~10で準備が整い、ホスト側からデバイスでカーネルを実行するステップ11に入る。
カーネル実行(コマンドキューへ投入)は、デバイスに対する働きかけとなるので、コマンドキューへのキューイング関数となる。
OpenCLランタイムAPIで定義されているカーネル実行機能を提供する関数clEnqueueTask()を用いて、カーネルhelloをデバイスで実行するコマンドをキューイングする。カーネルhelloを実行するコマンドがキューイングされた後、デバイス上の実行可能な演算ユニットで実行されることになる。
OpenCLランタイムAPIで定義されているデバイス側のメモリからホスト側のメモリへデータをコピーする機能を提供する関数clEnqueueReadBuffer()を用いて、デバイス側のメモリ領域からホスト側のメモリ領域にデータをコピーする。また、ホスト側からクライアント側のメモリへデータをコピーする機能を提供する関数clEnqueueWrightBuffer()を用いて、ホスト側のメモリ領域からデバイス側のメモリ領域にデータをコピーする。なお、これらの関数は、デバイスに対する働きかけとなるので、一度コマンドキューへコピーコマンドがキューイングされてからデータコピーが始まることになる。
最後に、ここまでに作成してきた各種オブジェクトを解放する。
以上、OpenCL C言語に沿って作成されたカーネルの、デバイス実行について説明した。
PLD処理パターン作成部215は、リソース量算出機能として、作成したOpenCLをプレコンパイルして利用するリソース量を算出する(「1回目のリソース量算出」)。PLD処理パターン作成部215は、算出した算術強度およびリソース量に基づいてリソース効率を算出し、算出したリソース効率をもとに、各ループ文で、リソース効率が所定の値より高いc個のループ文を選ぶ。
PLD処理パターン作成部215は、組み合わせたオフロードOpenCLでプレコンパイルして利用するリソース量を算出する(「2回目のリソース量算出」)。ここで、プレコンパイルせず、1回目測定前のプレコンパイルでのリソース量の和でもよい。
性能測定部118は、作成されたPLD処理パターンのアプリケーションをコンパイルして、検証用マシン14に配置し、PLDにオフロードした際の性能測定用処理を実行する。
PLD処理パターン作成部215は、高リソース効率のループ文を絞り込み、実行ファイル作成部119が絞り込んだループ文をオフロードするOpenCLをコンパイルする。性能測定部118は、コンパイルされたプログラムの性能を測定する(「1回目の性能測定」)。
なお、プレコンパイルせず、1回目測定前のプレコンパイルでのリソース量の和でもよい。実行ファイル作成部119は、組み合わせたオフロードOpenCLをコンパイルし、性能測定部118は、コンパイルされたプログラムの性能を測定する(「2回目の性能測定」)。
実行ファイル作成部119は、所定回数繰り返された、処理時間の測定結果をもとに、複数のPLD処理パターンから最高評価値のPLD処理パターンを選択し、最高評価値のPLD処理パターンをコンパイルして実行ファイルを作成する。
[自動オフロード動作]
本実施形態のオフロードサーバ1Aは、環境適応ソフトウェアの要素技術としてユーザアプリケーションロジックのFPGA自動オフロードに適用した例である。
図2に示すオフロードサーバ1Aの自動オフロード処理を参照して説明する。
図2に示すように、オフロードサーバ1Aは、環境適応ソフトウェアの要素技術に適用される。オフロードサーバ1Aは、制御部(自動オフロード機能部)11と、テストケースDB131と、中間言語ファイル133と、検証用マシン14と、を有している。
オフロードサーバ1Aは、ユーザが利用するアプリケーションコード(Application code)125を取得する。
<ステップS21:Specify application code>
ステップS21において、アプリケーションコード指定部111(図13参照)は、ユーザに提供しているサービスの処理機能(画像分析等)を特定する。具体的には、アプリケーションコード指定部111は、入力されたアプリケーションコードの指定を行う。
ステップS12において、アプリケーションコード分析部112(図13参照)は、処理機能のソースコードを分析し、ループ文やFFTライブラリ呼び出し等の特定ライブラリ利用の構造を把握する。
ステップS13において、PLD処理指定部213(図13参照)は、アプリケーションのループ文(繰り返し文)を特定し、各繰り返し文に対して、FPGAにおける並列処理またはパイプライン処理を指定して、高位合成ツールでコンパイルする。具体的には、オフロード範囲抽出部213a(図13参照)は、ループ文等、FPGAにオフロード可能な処理を特定し、オフロード処理に応じた中間言語としてOpenCLを抽出する。
ステップS14において、中間言語ファイル出力部213b(図13参照)は、中間言語ファイル133を出力する。中間言語抽出は、一度で終わりでなく、適切なオフロード領域探索のため、実行を試行して最適化するため反復される。
ステップS15において、PLD処理パターン作成部215(図13参照)は、コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ない繰り返し文に対して、FPGA処理するかしないかの指定を行うPLD処理パターンを作成する。
ステップS21において、バイナリファイル配置部118a(図13参照)は、FPGAを備えた検証用マシン14に、中間言語から導かれる実行ファイルをデプロイする。バイナリファイル配置部118aは、配置したファイルを起動し、想定するテストケースを実行して、オフロードした際の性能を測定する。
ステップS22において、性能測定部118(図13参照)は、配置したファイルを実行し、オフロードした際の性能と電力使用量を測定する。
オフロードする領域をより適切にするため、この性能測定結果は、オフロード範囲抽出部213aに戻され、オフロード範囲抽出部213aが、別パターンの抽出を行う。そして、中間言語ファイル出力部213bは、抽出された中間言語をもとに、性能測定を試行する(図2の符号a参照)。性能測定部118は、検証環境での性能・電力使用量測定を繰り返し、最終的にデプロイするコードパターンを決定する。
ステップS23において、本番環境配置部120は、最終的なオフロード領域を指定したパターンを決定し、ユーザ向けの本番環境にデプロイする。
ステップS24において、性能測定テスト抽出実行部121は、実行ファイル配置後、ユーザに性能を示すため、性能試験項目をテストケースDB131から抽出し、抽出した性能試験を自動実行する。
ステップS25において、ユーザ提供部122は、性能試験結果を踏まえた、価格・性能等の情報をユーザに提示する。ユーザは、提示された価格・性能等の情報をもとに、サービスの課金利用開始を判断する。
上述したコード分析は、Clang等の構文解析ツールを用いて、アプリケーションコードの分析を行う。コード分析は、オフロードするデバイスを想定した分析が必要になるため、一般化は難しい。ただし、ループ文や変数の参照関係等のコードの構造を把握したり、機能ブロックとしてFFT処理を行う機能ブロックであることや、FFT処理を行うライブラリを呼び出している等を把握することは可能である。機能ブロックの判断は、オフロードサーバが自動判断することは難しい。これもDeckard等の類似コード検出ツールを用いて類似度判定等で把握することは可能である。ここで、Clangは、C/C++向けツールであるが、解析する言語に合わせたツールを選ぶ必要がある。
[フローチャート]
図14は、オフロードサーバ1Aの動作概要を説明するフローチャートである。
ステップS201でアプリケーションコード分析部112は、アプリケーションのオフロードしたいソースコードの分析を行う。アプリケーションコード分析部112は、ソースコードの言語に合わせて、ループ文や変数の情報を分析する。
ステップS203で算術強度算出部214は、算術強度分析ツールを用いてアプリケーションのループ文の算術強度を算出する。算術強度は、計算数が多いと増加し、アクセス数が多いと減少する指標であり、算術強度が高い処理はプロセッサにとって重い処理となる。そこで、算術強度分析ツールで、ループ文の算術強度を分析し、密度が高いループ文をオフロード候補に絞る。そこで、算術強度分析ツールで、ループ文の算術強度を分析し、密度が高いループ文をオフロード候補に絞る。
FPGAにコンパイルする際の処理としては、OpenCL等の高位言語からハードウェア記述のHDL等のレベルに変換され、それに基づき実際の配線処理等がされる。この時、配線処理等は多大な時間がかかるが、HDL等の途中状態の段階までは時間は分単位でしかかからない。HDL等の途中状態の段階であっても、FPGAで利用するFlip FlopやLook Up Table等のリソースは分かる。このため、HDL等の途中状態の段階をみれば、利用するリソース量はコンパイルが終わらずとも短時間でわかる。
ステップS205でPLD処理パターン作成部215は、ループ文のうち、高算術強度で高ループ回数のループ文を絞り込む。
ステップS213でPLD処理パターン作成部215は、組み合わせたオフロードOpenCLでプレコンパイルして利用するリソース量を算出する(「2回目のリソース量算出」)。なお、プレコンパイルせず、1回目測定前のプレコンパイルでのリソース量の和でもよい。このようにすれば、プレコンパイル回数を削減することができる。
図16は、PLD処理パターン作成部215の探索イメージを示す図である。
制御部(自動オフロード機能部)21(図13参照)は、ユーザが利用するアプリケーションコード(Application code)125(図2参照)を分析し、図16に示すように、アプリケーションコード125のコードパターン(Code patterns)241からfor文の並列可否をチェックする。図16の符号rに示すように、コードパターン241から4つのfor文が見つかった場合、各for文に対してそれぞれ1桁、ここでは4つのfor文に対し4桁の1または0を割り当てる。ここでは、FPGA処理する場合は1、FPGA処理しない場合(すなわちCPUで処理する場合)は0とする。
図17の手順A-Fは、CコードからOpenCL最終解の探索までの流れを説明する図である。
アプリケーションコード分析部112(図13参照)は、図17の手順Aに示す「Cコード」を構文解析し(<構文解析>:図17の符号s参照)、PLD処理指定部213(図13参照)は、図17の手順Bに示す「ループ文、変数情報」を特定する(図17の符号t参照)。
さらに、OpenCL化時にコード分割と共に展開等の高速化手法を導入する(後記)。
例えば、アプリケーションコード130のコードパターン241(図16参照)から4つのfor文(4桁の1または0の割り当て)が見つかった場合、算術強度分析で3つが絞り込まれる(選ばれる)。すなわち、図17の符号uに示すように、4つのfor文から、3つのfor文のオフロードパターン「1000」「0010」「0001」が絞り込まれる。
FPGAからCPUへのデータ転送する場合の、CPUプログラム側で記述されるループ文〔k=0; k<10; k++〕 {
}
において、このループ文の上部に、\pragma unrollを指示する。すなわち、
\pragma unroll
for(k=0; k<10; k++){
}
と記述する。
また、unrollで展開する数は全ループ回数個でなく5個に展開等の指定もでき、その場合は、ループ2回ずつが、5つに展開される。
以上で、「展開」例についての説明を終える。
図17の符号uに示すように、算術強度分析で絞り込まれた4つのオフロードパターン「1000」「0100」「0010」「0001」の中から、上記リソース効率分析により3つのオフロードパターン「1000」「0010」「0001」に絞り込む。
以上、図17の手順Cに示す「高算術強度,OpenCL化」について説明した。
そして、PLD処理パターン作成部215は、性能測定された中でCPUに比べ高性能化されたループ文をリスト化する。以下、同様に、リソース量を算出、オフロードOpenCLコンパイル、コンパイルされたプログラムの性能を測定する。
図17の符号wに示すように、3つのオフロードパターン「1000」「0010」「0001」について1回目測定を行う。その3つの測定の中で、「1000」「0010」の2つの性能が高くなったとすると、「1000」と「0010」の組合せについて2回目測定を行う。
図17の符号yに示すように、「1000」と「0010」の組合せである「1010」について2回目測定する。2回測定し、その結果、1回目測定と2回目測定の中で最高速度の「0010」が選択された。このような場合、「0010」が最終の解となる。ここで、組合せパターンがリソース量制限のため測定できない場合がある。この場合、組合せについてはスキップして、単体の結果から最高速度のものを選ぶだけでもよい。
OpenCL最終解の、最高処理性能のPLD処理パターンで、本番環境に改めてデプロイして、ユーザに提供する。
実装例を説明する。
FPGAはIntel PAC with Intel Arria10 GX FPGA等が利用できる。
FPGA処理は、Intel Acceleration Stack(Intel FPGA SDK for OpenCL、Quartus Prime Version)等が利用できる。
Intel FPGA SDK for OpenCLは、標準OpenCLに加え、Intel向けの#pragma等を解釈する高位合成ツール(HLS)である。
実装例では、FPGAで処理するカーネルとCPUで処理するホストプログラムを記述したOpenCLコードを解釈し、リソース量等の情報を出力し、FPGAの配線作業等を行い、FPGAで動作できるようにする。FPGA実機で動作できるようにするには、100行程度の小プログラムでも3時間程の長時間がかかる。ただし、リソース量オーバーの際は、早めにエラーとなる。また、FPGAで処理できないOpenCLコードの際は、数時間後にエラーを出力する。
次に、gcov等のプロファイリングツールを用いて、各ループのループ回数を取得する。算術強度×ループ回数が上位a個のループ文を候補に絞る。
実装例では、最後に、複数の測定パターンの高速なパターンを解として選択する。
評価を説明する。
第2実施形態の[ループ文のFPGA自動オフロード]では、第1実施形態の[ループ文のGPU自動オフロード]と同様に評価できる。
評価対象は、第2実施形態の[ループ文のFPGA自動オフロード]では、MRI(Magnetic Resonance Imaging)画像処理のMRI-Qとする。
MRI-Qは、非デカルト空間の3次元MRI再構成アルゴリズムで使用されるスキャナー構成を表す行列Qを計算する。MRI-Qは、C言語で記述されており、性能測定中に3次元MRI画像処理を実行し、Large(最大)の64×64×64サイズのデータで処理時間を測定する。CPU処理は、C言語を用い、FPGA処理はOpenCL に基づき処理される。
対象となるアプリケーションのコードを入力し、移行先のGPUやFPGAに対して、Clang等で認識されたループ文オフロードを試行してオフロードパターンを決める。この際に、処理時間と電力使用量を測定する。最終オフロードパターンについて、電力使用量の時間変化を取得し、全てCPUで処理する場合に比べた低電力化を確認する。
第2実施形態の[ループ文のFPGA自動オフロード]では、GAは行わず、算術強度等を用いて、測定パターンが4パターンとなるまで絞り込む。
オフロード対象ループ文: MRI-Q 16
パターン適合度:処理時間が低い程、評価値が高くなり、高適合度になる。第2の実施形態のMRI-Qでも前述の図12のような形で、単純に安さ優先や応答時間優先の配置に比べて、コストや応答時間が改善できる。
第1および第2の実施形態に係るオフロードサーバは、例えば図18に示すような構成の物理装置であるコンピュータ900によって実現される。
図18は、オフロードサーバ1,1Aの機能を実現するコンピュータの一例を示すハードウェア構成図である。コンピュータ900は、CPU901、RAM902、ROM903、HDD904、アクセラレータ905、入出力インターフェイス(I/F)906、メディアインターフェイス(I/F)907、および通信インターフェイス(I/F:Interface)908を有する。
なお、アクセラレータ905として、CPU901またはRAM902からの処理を実行した後にCPU901またはRAM902に実行結果を戻すタイプ(look-aside型)を用いてもよい。一方、アクセラレータ905として、通信I/F908とCPU901またはRAM902との間に入って、処理を行うタイプ(in-line型)を用いてもよい。
ROM903は、コンピュータ900の起動時にCPU901によって実行されるブートプログラムや、コンピュータ900のハードウェアに依存するプログラム等を格納する。
以上説明したように、第1実施形態に係るオフロードサーバ1(図1参照)は、アプリケーションプログラムの特定処理をアクセラレータにオフロードするオフロードサーバであって、アプリケーションプログラムのソースコードを分析するアプリケーションコード分析部112と、アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行を用いたデータ転送指定を行うデータ転送指定部113と、アプリケーションプログラムのループ文を特定し、特定した各ループ文に対して、アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部114と、コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ないループ文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部117と、並列処理パターンのアプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部118と、変換したアプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定する配置設定部170と、を備える。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部又は一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的又は物理的に分散・統合して構成することができる。
例えば、Java(登録商標)では、Java 8よりlambda形式での並列処理記述が可能である。IBM(登録商標)は、lambda形式の並列処理記述を、GPUにオフロードするJITコンパイラを提供している。Javaでは、これらを用いて、ループ処理をlambda形式にするか否かのチューニングをGAで行うことで、同様のオフロードが可能である。
11,21 制御部
12 入出力部
13 記憶部
14 検証用マシン (アクセラレータ検証用装置)
111 アプリケーションコード指定部
112 アプリケーションコード分析部
113 データ転送指定部
114 並列処理指定部
114a,213a オフロード範囲抽出部
114b,213b 中間言語ファイル出力部
115 リソース比決定部
116 リソース量設定部
117 並列処理パターン作成部
118 性能測定部
118a バイナリファイル配置部
119 実行ファイル作成部
120 本番環境配置部
121 性能測定テスト抽出実行部
122 ユーザ提供部
125 アプリケーションコード
131 テストケースDB
132 設備リソースDB
133 中間言語ファイル
151 各種デバイス
152 CPU-GPUを有する装置
153 CPU-FPGAを有する装置
154 CPUを有する装置
170 配置設定部
213 PLD処理指定部
214 算術強度算出部
215 PLD処理パターン作成部
905 アクセラレータ
Claims (9)
- アプリケーションプログラムの特定処理をアクセラレータにオフロードするオフロードサーバであって、
前記アプリケーションプログラムのソースコードを分析するアプリケーションコード分析部と、
前記アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行を用いたデータ転送指定を行うデータ転送指定部と、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部と、
コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ないループ文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部と、
前記並列処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部と、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定する配置設定部と、を備え、
前記配置設定部は、サーバにアプリケーションプログラムを配置した際に、応答時間を極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロードサーバ。 - アプリケーションプログラムの特定処理をアクセラレータにオフロードするオフロードサーバであって、
前記アプリケーションプログラムのソースコードを分析するアプリケーションコード分析部と、
前記アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行を用いたデータ転送指定を行うデータ転送指定部と、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルする並列処理指定部と、
コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ないループ文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成する並列処理パターン作成部と、
前記並列処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行する性能測定部と、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定する配置設定部と、を備え、
前記配置設定部は、サーバにアプリケーションプログラムを配置した際に、計算リソースのコストを極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロードサーバ。 - アプリケーションプログラムの特定処理をPLD(Programmable Logic Device)にオフロードするオフロードサーバであって、
前記アプリケーションプログラムのソースコードを分析するアプリケーションコード分析部と、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記PLDにおけるパイプライン処理および並列処理をOpenCLで指定した複数のオフロード処理パターンにより作成してコンパイルするPLD処理指定部と、
前記アプリケーションプログラムのループ文の算術強度を算出する算術強度算出部と、
前記算術強度算出部が算出した算術強度をもとに、前記算術強度が所定の閾値より高いループ文をオフロード候補として絞り込み、PLD処理パターンを作成するPLD処理パターン作成部と、
作成された前記PLD処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記PLDにオフロードした際の性能測定用処理を実行する性能測定部と、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定する配置設定部と、を備え、
前記配置設定部は、サーバにアプリケーションプログラムを配置した際に、応答時間を極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロードサーバ。 - アプリケーションプログラムの特定処理をPLD(Programmable Logic Device)にオフロードするオフロードサーバであって、
前記アプリケーションプログラムのソースコードを分析するアプリケーションコード分析部と、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記PLDにおけるパイプライン処理および並列処理をOpenCLで指定した複数のオフロード処理パターンにより作成してコンパイルするPLD処理指定部と、
前記アプリケーションプログラムのループ文の算術強度を算出する算術強度算出部と、
前記算術強度算出部が算出した算術強度をもとに、前記算術強度が所定の閾値より高いループ文をオフロード候補として絞り込み、PLD処理パターンを作成するPLD処理パターン作成部と、
作成された前記PLD処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記PLDにオフロードした際の性能測定用処理を実行する性能測定部と、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定する配置設定部と、を備え、
前記配置設定部は、サーバにアプリケーションプログラムを配置した際に、計算リソースのコストを極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロードサーバ。 - アプリケーションプログラムの特定処理をアクセラレータにオフロードするオフロードサーバのオフロード制御方法であって、
前記オフロードサーバは、
前記アプリケーションプログラムのソースコードを分析するステップと、
前記アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行を用いたデータ転送指定を行うステップと、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルするステップと、
コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ないループ文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成するステップと、
前記並列処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行するステップと、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定するステップと、を実行し、
前記アプリケーションプログラムの配置場所を計算して設定するステップにおいて、サーバにアプリケーションプログラムを配置した際に、応答時間を極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロード制御方法。 - アプリケーションプログラムの特定処理をアクセラレータにオフロードするオフロードサーバのオフロード制御方法であって、
前記オフロードサーバは、
前記アプリケーションプログラムのソースコードを分析するステップと、
前記アプリケーションプログラムのループ文の中で用いられる変数の参照関係を分析し、ループ外でデータ転送してよいデータについては、ループ外でのデータ転送を明示的に指定する明示的指定行を用いたデータ転送指定を行うステップと、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記アクセラレータにおける並列処理指定文を指定してコンパイルするステップと、
コンパイルエラーが出るループ文に対して、オフロード対象外とするとともに、コンパイルエラーが出ないループ文に対して、並列処理するかしないかの指定を行う並列処理パターンを作成するステップと、
前記並列処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記アクセラレータにオフロードした際の性能測定用処理を実行するステップと、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定するステップと、を実行し、
前記アプリケーションプログラムの配置場所を計算して設定するステップにおいて、サーバにアプリケーションプログラムを配置した際に、計算リソースのコストを極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロード制御方法。 - アプリケーションプログラムの特定処理をPLD(Programmable Logic Device)にオフロードするオフロードサーバのオフロード制御方法であって、
前記オフロードサーバは、
前記アプリケーションプログラムのソースコードを分析するステップと、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記PLDにおけるパイプライン処理および並列処理をOpenCLで指定した複数のオフロード処理パターンにより作成してコンパイルするステップと、
前記アプリケーションプログラムのループ文の算術強度を算出するステップと、
算出した算術強度をもとに、前記算術強度が所定の閾値より高いループ文をオフロード候補として絞り込み、PLD処理パターンを作成するステップと、
作成された前記PLD処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記PLDにオフロードした際の性能測定用処理を実行するステップと、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定するステップと、を実行し、
前記アプリケーションプログラムの配置場所を計算して設定するステップにおいて、サーバにアプリケーションプログラムを配置した際に、応答時間を極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロード制御方法。 - アプリケーションプログラムの特定処理をPLD(Programmable Logic Device)にオフロードするオフロードサーバのオフロード制御方法であって、
前記オフロードサーバは、
前記アプリケーションプログラムのソースコードを分析するステップと、
前記アプリケーションプログラムのループ文を特定し、特定した各前記ループ文に対して、前記PLDにおけるパイプライン処理および並列処理をOpenCLで指定した複数のオフロード処理パターンにより作成してコンパイルするステップと、
前記アプリケーションプログラムのループ文の算術強度を算出するステップと、
算出した算術強度をもとに、前記算術強度が所定の閾値より高いループ文をオフロード候補として絞り込み、PLD処理パターンを作成するステップと、
作成された前記PLD処理パターンの前記アプリケーションプログラムをコンパイルして、アクセラレータ検証用装置に配置し、前記PLDにオフロードした際の性能測定用処理を実行するステップと、
変換した前記アプリケーションプログラムを、ユーザの指定するコストまたは応答時間の条件に応じて、ネットワーク上の、クラウドサーバ、キャリアエッジサーバ、ユーザエッジサーバのいずれかに配置する際、デバイスおよびリンクのコスト、計算リソース上限、帯域上限を制約条件とし、かつ計算リソースのコストまたは応答時間を目的関数とした線形計画式に基づいて、アプリケーションプログラムの配置場所を計算して設定するステップと、を実行し、
前記アプリケーションプログラムの配置場所を計算して設定するステップにおいて、サーバにアプリケーションプログラムを配置した際に、計算リソースのコストを極小化する配置を次式に示す線形計画式に従って計算する
ことを特徴とするオフロード制御方法。 - コンピュータを、請求項1乃至請求項4のいずれか一項に記載のオフロードサーバとして機能させるためのオフロードプログラム。
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| PCT/JP2022/002880 WO2023144926A1 (ja) | 2022-01-26 | 2022-01-26 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JPWO2023144926A1 JPWO2023144926A1 (ja) | 2023-08-03 |
| JP7716632B2 true JP7716632B2 (ja) | 2025-08-01 |
Family
ID=87471201
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2023576454A Active JP7716632B2 (ja) | 2022-01-26 | 2022-01-26 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
Country Status (2)
| Country | Link |
|---|---|
| JP (1) | JP7716632B2 (ja) |
| WO (1) | WO2023144926A1 (ja) |
Citations (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN111405569A (zh) | 2020-03-19 | 2020-07-10 | 三峡大学 | 基于深度强化学习的计算卸载和资源分配方法及装置 |
| WO2020175411A1 (ja) | 2019-02-25 | 2020-09-03 | 日本電信電話株式会社 | アプリケーション配置装置及びアプリケーション配置プログラム |
| WO2021156955A1 (ja) | 2020-02-04 | 2021-08-12 | 日本電信電話株式会社 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
| WO2021156956A1 (ja) | 2020-02-04 | 2021-08-12 | 日本電信電話株式会社 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
-
2022
- 2022-01-26 JP JP2023576454A patent/JP7716632B2/ja active Active
- 2022-01-26 WO PCT/JP2022/002880 patent/WO2023144926A1/ja not_active Ceased
Patent Citations (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| WO2020175411A1 (ja) | 2019-02-25 | 2020-09-03 | 日本電信電話株式会社 | アプリケーション配置装置及びアプリケーション配置プログラム |
| WO2021156955A1 (ja) | 2020-02-04 | 2021-08-12 | 日本電信電話株式会社 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
| WO2021156956A1 (ja) | 2020-02-04 | 2021-08-12 | 日本電信電話株式会社 | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
| CN111405569A (zh) | 2020-03-19 | 2020-07-10 | 三峡大学 | 基于深度强化学习的计算卸载和资源分配方法及装置 |
Non-Patent Citations (1)
| Title |
|---|
| 山登庸次,「環境適応アプリケーション配置適正化の初期検討」,engrxiv.org [online],2021年07月11日,[取得日 2025年2月28日], 取得先 <https://engrxiv.org/preprint/view/1770/version/2691>,<DOI: https://doi.org/10.31224/osf.io/vdn8z> |
Also Published As
| Publication number | Publication date |
|---|---|
| WO2023144926A1 (ja) | 2023-08-03 |
| JPWO2023144926A1 (ja) | 2023-08-03 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JP7063289B2 (ja) | オフロードサーバのソフトウェア最適配置方法およびプログラム | |
| JP6927424B2 (ja) | オフロードサーバおよびオフロードプログラム | |
| JP7632712B2 (ja) | オフロードサーバ、および、オフロード制御方法 | |
| US12530296B2 (en) | Systems, apparatus, articles of manufacture, and methods for improved data transfer for heterogeneous programs | |
| Yamato | Proposal and evaluation of GPU offloading parts reconfiguration during applications operations for environment adaptation | |
| JP7322978B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| US12056475B2 (en) | Offload server, offload control method, and offload program | |
| US11947975B2 (en) | Offload server, offload control method, and offload program | |
| JP7716632B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| JP7806893B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| JP7544142B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| US12033235B2 (en) | Offload server, offload control method, and offload program | |
| JP7662037B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| JP7521597B2 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| JP7184180B2 (ja) | オフロードサーバおよびオフロードプログラム | |
| WO2024147197A1 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム | |
| WO2024079886A1 (ja) | オフロードサーバ、オフロード制御方法およびオフロードプログラム |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20240528 |
|
| A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20250311 |
|
| A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20250508 |
|
| TRDD | Decision of grant or rejection written | ||
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20250617 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20250630 |
|
| R150 | Certificate of patent or registration of utility model |
Ref document number: 7716632 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 |