windows hpc server 講習会 第2回 開発編
DESCRIPTION
Windows HPC Serverに関する講習会。今回は実際に開発で使う際の方法を説明しています。バッチジョブ、MPI、HPC SOAなど複数のプログラミング手法が使えて便利ですね。TRANSCRIPT
HPC Server 講習会第 2 回 開発編
2011/11/24デンソーアイティーラボラトリ 増谷
1. 前回までの復習
前回の復習• HPC Server とは– Microsoft の HPC 用プラットフォーム– Windows Server, Windows 7, Windows Azure を組み込め
る• 基本概念– ジョブ、タスク、ノード
• 使い方– シリアルアプリケーション– パラメータスイープ– Matlab からの利用
前回の復習• 「 HPC Server 講習会 第1回 導入編」– 以下参照– http://
2.HPC プログラミング
様々なプログラミング手法• メッセージングAPI– クラスタ間の通信にメッセージングを利用す
るもの– Windows HPC Server では、もっぱらこのタイ
プをサポート– 複数のAPI• MPI• HPC SOA
最近の情報• Build windows での発表– HPC Server のノードとして、 Azure の VM Role
が使えるようになった– 任意のプログラムをインストール可能、ネイ
ティブ動作も可能• 該当セッション– http://channel9.msdn.com/events/BUILD/
BUILD2011/SAC-452T– 最後に私も質問
3.MPI で HPC る
MPI とは• Message Passing Interface
– 並列コンピューティング利用のための標準規格– 複数の CPU が情報をバイト列からなるメッセージとして送受信
することで協調動作を行えるようにする。– SPMD(Single Program Multi Data) 用
• メリット– ライブラリレベルでの並列化であるため、言語を問わず利用で
き、プログラマが細密なチューニングを行える– 様々な実装で同じソースが利用できる
• デメリット– 利用にあたっては明示的に手続きを記述する必要があり、ロッ
クの対処などもプログラマ側が大きな責任をもたなければならない
MPI の実装• 仕様– MPI forum– http://www.mpi-forum.org/
• 代表的な実装– Open MPI
• MacOS にデフォルトインストール– Intel MPI Library
• IA に特化 Windows/Linux– LAM/MPI– MPICH
• 本家 Argonne NL のリファレンス実装– MVAPICH– MS MPI
• MPICH 互換 + セキュリティ要件
MPI のプログラム• hello.c
• mpi.h のインクルードと、いくつかのセットアップ、ランクの読み込みなどがあるだけ。
• rank を用いてファイル切り替えなどやれば、パラメータスイープと同様のことが可能に– 統合しなくても良いやりっぱなしプログラムならこれでOK
#include <mpi.h>
int main(int argc, char *argv[]) { int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen);
printf("Process %d on %s out of %d\n", rank, processor_name, numprocs);
MPI_Finalize();}
全体のプロセス数
ランク:何番目のプロセスか
コマンドラインでの実行• コンパイル– Cc hello.c -lmpi– mpicc hello.c
• 実行– mpirun –np 8 a.out– ※ プロセス数を 8 としている
MPI の機能• メッセージの送信– 送信バッファ、宛先ランク、タグなどを指定
• メッセージの受信– 受信バッファ、送信元ランク、タグなどを指
定
#include "mpi.h"int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm )
#include "mpi.h"int MPI_Recv( void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status )
MPI メッセージの謎の引数• タグ– 受け取ったデータが何なのか、どのように使
うかを指定するのに使う– 同じタグに別々のライブラリからの処理が対
応づけられていた場合は?• コミュニケータ– 錯綜を避けるため、受信する相手を指定でき
るようにする
4 VISUAL STUDIO で MPI
Visual Studio を使うメリット
• 一般的な利点– 優れたエディタ– ライブラリの管理
• MPI 向け– MPI Cluster Debugger を使える
MPI Cluster Debugger
• HPC Server と直結したクラスタデバッグを行うことができる
• 利用方法– プロジェクトプロパティの debugging より、
選択するだけ
MPI Cluster Debugger
• Node 選択– 実行ごとに好き
なノードを選択できる。
– ノード単位、コア単位、ソケット単位などが指定できる。
MPI Cluster Debugger
• その他の実行パラメータ– Main パラメータ– MPI パラメータ– タイムアウト– 前、後処理
MPI Cluster Debugger
• デバッグの実際– プロセスビュアーで各
スレッドが見える– ブレークポイントもス
レッド数分
5 MPI + GPGPU
とにかく最高性能を狙いたい
• GPGPU を活用– 1 台当たり1TFLOPSの性能を引き出し
たい– CUDA ベースのプログラムをばらまきたい
• Windows HPC Server で対応– GPU クラスタ 診断など対応– コンソールアタッチ
注意事項• 通常のGPUはコンソールが無いと使え
ない– ドライバを読み込む必要がある– HPC にコンソールをアタッチする機能が備わ
る– レジストリ編集と環境変数設定を行えばOK
• サンプル– 各マシンから Gflops を計測して、足し算– MPI_Reduce(&gflops, &result, 1, MPI_DOUBLE,
MPI_SUM, 0, MPI_COMM_WORLD);
6 HPC SOA
.NET な人向け• MPI とは一味違う– Service Oriented Architecture• 全てをサービスとして扱う分散コンピューティン
グ• HPC のワーカーもサービス
– WCF を利用• WSDL 的なサービスコントラクト• クライアント、サーバの記述をきっちりしないと
動かない• 慣れればそれほど大変でもないが・・・
HPC SOA を始める• Visual Studio のプロジェクト作成– Durable Session Client– Interactive Session Client
• クライアントのひな形とデバッガが用意されている
Cluster debugger for SOA
• MPI 用とほぼ同機能
• 実行 Node 選択• パラメータ設定
Service を作成する• WCF のサービス生成– サービスコントラクト
としてクラスのインターフェイスを設定
–オペレーションコントラクトとしてメソッドを設定
Service を作成する• サービスを実装する– インターフェイスを実装すれば良い
Service を作成する• Service.config を作成する– アッセンブリ名、コントラクト名、サービス
タイプなどを指定する。
<microsoft.Hpc.Session.ServiceRegistration> <service assembly="\\MyHeadNode\Apps\SquareService\SquareService.dll" contract="SquareServiceContracts.ISquareService" type="Services.SquareService" includeExceptionDetailInFaults="true" maxConcurrentCalls="0" serviceInitializationTimeout="60000" stdError="" maxMessageSize="65536"> </service></microsoft.Hpc.Session.ServiceRegistration>
Client から呼ぶ• SessionStartInfo でヘッドノード名と、サー
ビス名を設定する。– ノードグループも設定
// The name of the head node in the cluster.string schedulerName = ConfigurationManager.AppSettings["HeadNodeName"]; // The name of the called service.string serviceName = ConfigurationManager.AppSettings["SoaServiceName"]; SessionStartInfo info = new SessionStartInfo(schedulerName, serviceName); info.Secure = false; info.NodeGroupList.Add(
ConfigurationManager.AppSettings["NodeGroup"]);
Client から呼ぶ• Session を作成する
• Client にコールバックを設定
• Client からコール
SquareServiceClient proxy = new SquareServiceClient( new NetTcpBinding(SecurityMode.None), session.NetTcpEndpointReference); proxy.SquareCompleted += (sender, e) => { try { int reply = e.Result.SquareResult; Console.WriteLine("Received response for request {0}: {1}", e.UserState, reply); if (Interlocked.Increment(ref count) == _numOfRequests) { done.Set(); } }; // start to send requestsConsole.WriteLine("Sending {0} requests...", _numOfRequests);for (int i = 0; i < _numOfRequests; i++){ proxy.SquareAsync(new SquareRequest(1000 + i), i);}
Session session = Session.CreateSession(info))
まとめ• MPI は様々な言語に対応しているので、汎
用性の高いプログラムを書くのに適している
• GPGPU で最高性能を引き出したい人はVC++ で MPI が最適
• .NET で簡単にやってみたい人は SOA を利用。