windows hpc server 講習会 第2回 開発編

33
HPC Server 講講講 講 2 講 講講講 2011/11/24 講講講講講講講講講講講講講講 講講

Upload: osamu-masutani

Post on 18-Dec-2014

1.944 views

Category:

Technology


6 download

DESCRIPTION

Windows HPC Serverに関する講習会。今回は実際に開発で使う際の方法を説明しています。バッチジョブ、MPI、HPC SOAなど複数のプログラミング手法が使えて便利ですね。

TRANSCRIPT

Page 1: Windows HPC Server 講習会 第2回 開発編

HPC Server 講習会第 2 回 開発編

2011/11/24デンソーアイティーラボラトリ 増谷

Page 2: Windows HPC Server 講習会 第2回 開発編

1. 前回までの復習

Page 3: Windows HPC Server 講習会 第2回 開発編

前回の復習• HPC Server とは– Microsoft の HPC 用プラットフォーム– Windows Server, Windows 7, Windows Azure を組み込め

る• 基本概念– ジョブ、タスク、ノード

• 使い方– シリアルアプリケーション– パラメータスイープ– Matlab からの利用

Page 4: Windows HPC Server 講習会 第2回 開発編

前回の復習• 「 HPC Server 講習会 第1回 導入編」– 以下参照– http://

Page 5: Windows HPC Server 講習会 第2回 開発編

2.HPC プログラミング

Page 6: Windows HPC Server 講習会 第2回 開発編

様々なプログラミング手法• メッセージングAPI– クラスタ間の通信にメッセージングを利用す

るもの– Windows HPC Server では、もっぱらこのタイ

プをサポート– 複数のAPI• MPI• HPC SOA

Page 7: Windows HPC Server 講習会 第2回 開発編

最近の情報• Build windows での発表– HPC Server のノードとして、 Azure の VM Role

が使えるようになった– 任意のプログラムをインストール可能、ネイ

ティブ動作も可能• 該当セッション– http://channel9.msdn.com/events/BUILD/

BUILD2011/SAC-452T– 最後に私も質問

Page 8: Windows HPC Server 講習会 第2回 開発編

3.MPI で HPC る

Page 9: Windows HPC Server 講習会 第2回 開発編

MPI とは• Message Passing Interface

– 並列コンピューティング利用のための標準規格– 複数の CPU が情報をバイト列からなるメッセージとして送受信

することで協調動作を行えるようにする。– SPMD(Single Program Multi Data) 用

• メリット– ライブラリレベルでの並列化であるため、言語を問わず利用で

き、プログラマが細密なチューニングを行える– 様々な実装で同じソースが利用できる

• デメリット– 利用にあたっては明示的に手続きを記述する必要があり、ロッ

クの対処などもプログラマ側が大きな責任をもたなければならない

Page 10: Windows HPC Server 講習会 第2回 開発編

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 互換 + セキュリティ要件

Page 11: Windows HPC Server 講習会 第2回 開発編

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();}

全体のプロセス数

ランク:何番目のプロセスか

Page 12: Windows HPC Server 講習会 第2回 開発編

コマンドラインでの実行• コンパイル– Cc hello.c -lmpi– mpicc hello.c

• 実行– mpirun –np 8 a.out– ※ プロセス数を 8 としている

Page 13: Windows HPC Server 講習会 第2回 開発編

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 )

Page 14: Windows HPC Server 講習会 第2回 開発編

MPI メッセージの謎の引数• タグ– 受け取ったデータが何なのか、どのように使

うかを指定するのに使う– 同じタグに別々のライブラリからの処理が対

応づけられていた場合は?• コミュニケータ– 錯綜を避けるため、受信する相手を指定でき

るようにする

Page 15: Windows HPC Server 講習会 第2回 開発編

4 VISUAL STUDIO で MPI

Page 16: Windows HPC Server 講習会 第2回 開発編

Visual Studio を使うメリット

• 一般的な利点– 優れたエディタ– ライブラリの管理

• MPI 向け– MPI Cluster Debugger を使える

Page 17: Windows HPC Server 講習会 第2回 開発編

MPI Cluster Debugger

• HPC Server と直結したクラスタデバッグを行うことができる

• 利用方法– プロジェクトプロパティの debugging より、

選択するだけ

Page 18: Windows HPC Server 講習会 第2回 開発編

MPI Cluster Debugger

• Node 選択– 実行ごとに好き

なノードを選択できる。

– ノード単位、コア単位、ソケット単位などが指定できる。

Page 19: Windows HPC Server 講習会 第2回 開発編

MPI Cluster Debugger

• その他の実行パラメータ– Main パラメータ– MPI パラメータ– タイムアウト– 前、後処理

Page 20: Windows HPC Server 講習会 第2回 開発編

MPI Cluster Debugger

• デバッグの実際– プロセスビュアーで各

スレッドが見える– ブレークポイントもス

レッド数分

Page 21: Windows HPC Server 講習会 第2回 開発編

5 MPI + GPGPU

Page 22: Windows HPC Server 講習会 第2回 開発編

とにかく最高性能を狙いたい

• GPGPU を活用– 1 台当たり1TFLOPSの性能を引き出し

たい– CUDA ベースのプログラムをばらまきたい

• Windows HPC Server で対応– GPU クラスタ 診断など対応– コンソールアタッチ

Page 23: Windows HPC Server 講習会 第2回 開発編

注意事項• 通常のGPUはコンソールが無いと使え

ない– ドライバを読み込む必要がある– HPC にコンソールをアタッチする機能が備わ

る– レジストリ編集と環境変数設定を行えばOK

• サンプル– 各マシンから Gflops を計測して、足し算– MPI_Reduce(&gflops, &result, 1, MPI_DOUBLE,

MPI_SUM, 0, MPI_COMM_WORLD);

Page 24: Windows HPC Server 講習会 第2回 開発編

6 HPC SOA

Page 25: Windows HPC Server 講習会 第2回 開発編

.NET な人向け• MPI とは一味違う– Service Oriented Architecture• 全てをサービスとして扱う分散コンピューティン

グ• HPC のワーカーもサービス

– WCF を利用• WSDL 的なサービスコントラクト• クライアント、サーバの記述をきっちりしないと

動かない• 慣れればそれほど大変でもないが・・・

Page 26: Windows HPC Server 講習会 第2回 開発編

HPC SOA を始める• Visual Studio のプロジェクト作成– Durable Session Client– Interactive Session Client

• クライアントのひな形とデバッガが用意されている

Page 27: Windows HPC Server 講習会 第2回 開発編

Cluster debugger for SOA

• MPI 用とほぼ同機能

• 実行 Node 選択• パラメータ設定

Page 28: Windows HPC Server 講習会 第2回 開発編

Service を作成する• WCF のサービス生成– サービスコントラクト

としてクラスのインターフェイスを設定

–オペレーションコントラクトとしてメソッドを設定

Page 29: Windows HPC Server 講習会 第2回 開発編

Service を作成する• サービスを実装する– インターフェイスを実装すれば良い

Page 30: Windows HPC Server 講習会 第2回 開発編

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>

Page 31: Windows HPC Server 講習会 第2回 開発編

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"]);

Page 32: Windows HPC Server 講習会 第2回 開発編

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))

Page 33: Windows HPC Server 講習会 第2回 開発編

まとめ• MPI は様々な言語に対応しているので、汎

用性の高いプログラムを書くのに適している

• GPGPU で最高性能を引き出したい人はVC++ で MPI が最適

• .NET で簡単にやってみたい人は SOA を利用。