インテル® Xeon® プロセッサー・ベースのホストとインテル® Xeon Phi™ コプロセッサー間の MPI 通信の改善
この記事は、インテル® デベロッパー・ゾーンに公開されている「Improving MPI Communication between the Intel® Xeon® Host and Intel® Xeon Phi™」の日本語参考訳です。
MPI シンメトリック・モードは、インテル® Xeon Phi™ コプロセッサーを搭載したシステムで広く利用されています。1 台以上のコプロセッサーを搭載するインテル® Xeon® プロセッサー・ベースのホストシステムでは、伝送制御プロトコル (TCP) は、同じホスト上のホストとコプロセッサー間、もしくはコプロセッサー間で送信される MPI メッセージに使用されます。クリティカルなアプリケーションでは、この MPI 通信では十分な速度を見込めないことがあります。
この記事では、ファブリックとして Direct Access Programming Library (DAPL) を使用するため OFED スタックをインストールすることで、MPI ノード間通信 (インテル® Xeon® プロセッサー・ベースのホストとインテル® Xeon Phi™ コプロセッサー間の) を改善する方法を紹介します。ホストシステムが InfiniBand* ホスト・チャンネル・コントローラー (HCA) を持っていない場合でも、DAPL ファブリックは、scif0 を経由して MPI メッセージを仮想 InfiniBand* インターフェイスへ転送するために利用できます。
Linux* カーネルバージョン 2.6.32-279 が稼働するインテル® Xeon® プロセッサー E5-2670 と 2 台のインテル® XeonPhi™ コプロセッサー C0-7120 (mic0 と mic1) を搭載するシステム上で、インテル® MPSS 3.3.2 とインテル® MPI ライブラリー 5.0 をホストにインストールしました。インテル® MPI ライブラリーは、ベンチマーク・ツール IMB-MPI1 を含んでいます。分かりやすく説明するため、OFED スタックをインストールする前と後でインテル® MPI ベンチマークの Sendrecv を実行して結果を比較しました。このテストでは 2 つのプロセスを使用しており、各プロセスはお互いにメッセージを送信および受信し合います。ツールは、双方向の帯域幅をレポートします。
テストを実行するため、コプロセッサー版のインテル® MPI ベンチマーク・ツール (IMB-MPI1) をコプロセッサー上にコピーします。
# scp /opt/intel/impi/5.0.1.035/mic/bin/IMB-MPI1 mic0:/tmp
# scp /opt/intel/impi/5.0.1.035/mic/bin/IMB-MPI1 mic1:/tmp
ホスト-コプロセッサーとコプロセッサー-コプロセッサー間の通信を有効にします。
# export I_MPI_MIC=enable
# /sbin/sysctl -w net.ipv4.ip_forward=1
最初のテストでは、ホストと mic0 間で Sendrecv ベンチマークを実行しました。
# mpirun -host localhost -n 1 /opt/intel/impi/5.0.1.035/bin64/IMB-MPI1 \
Sendrecv :-host mic0 -n 1 /tmp/IMB-MPI1
Sendrecv ベンチマーク:
#------------------------------------------------------------ # Intel (R) MPI Benchmarks 4.0, MPI-1 part #------------------------------------------------------------ # Date : Mon Nov 24 12:26:53 2014 # Machine : x86_64 # System : Linux # Release : 2.6.32-279.el6.x86_64 # Version : #1 SMP Wed Jun 13 18:24:36 EDT 2012 # MPI Version : 3.0 # MPI Thread Environment: # New default behavior from Version 3.2 on: # the number of iterations per message size is cut down # dynamically when a certain run time (per message size sample) # is expected to be exceeded. Time limit is defined by variable # "SECS_PER_SAMPLE" (=> IMB_settings.h) # or through the flag => -time # Calling sequence was: # /opt/intel/impi/5.0.1.035/bin64/IMB-MPI1 Sendrecv # Minimum message length in bytes: 0 # Maximum message length in bytes: 4194304 # # MPI_Datatype : MPI_BYTE # MPI_Datatype for reductions : MPI_FLOAT # MPI_Op : MPI_SUM # # # List of Benchmarks to run: # Sendrecv #-------------------------------------------------------------------------- # Benchmarking Sendrecv # #processes = 2 #-------------------------------------------------------------------------- #bytes #repetitions t_min[usec] t_max[usec] t_avg[usec] Mbytes/sec 0 1000 129.93 129.93 129.93 0.00 1 1000 130.12 130.12 130.12 0.01 2 1000 130.48 130.48 130.48 0.03 4 1000 130.63 130.63 130.63 0.06 8 1000 130.25 130.25 130.25 0.12 16 1000 130.40 130.40 130.40 0.23 32 1000 126.92 126.92 126.92 0.48 64 1000 121.18 121.18 121.18 1.01 128 1000 119.91 119.92 119.91 2.04 256 1000 118.83 118.83 118.83 4.11 512 1000 139.81 139.83 139.82 6.98 1024 1000 146.87 146.88 146.87 13.30 2048 1000 153.28 153.28 153.28 25.48 4096 1000 146.91 146.91 146.91 53.18 8192 1000 159.63 159.64 159.63 97.88 16384 1000 212.52 212.55 212.53 147.03 32768 1000 342.03 342.08 342.05 182.70 65536 640 484.54 484.78 484.66 257.85 131072 320 808.74 809.64 809.19 308.78 262144 160 1685.54 1688.78 1687.16 296.07 524288 80 2862.96 2875.35 2869.16 347.78 1048576 40 4978.17 5026.92 5002.55 397.86 2097152 20 8871.96 9039.75 8955.85 442.49 4194304 10 16531.30 17194.01 16862.65 465.28 # All processes entering MPI_Finalize
上記の表には、異なるメッセージ長の平均時間と帯域幅が示されています。
次に mic0 と mic1 間のデータを収集するためベンチーマークを実行します。
# mpirun -host mic0 -n 1 /tmp/IMB-MPI1 Sendrecv :-host mic1 -n 1 /tmp/IMB-MPI1
#-------------------------------------------------------------------------- # Benchmarking Sendrecv # #processes = 2 #-------------------------------------------------------------------------- #bytes #repetitions t_min[usec] t_max[usec] t_avg[usec] Mbytes/sec 0 1000 210.77 210.77 210.77 0.00 1 1000 212.45 212.69 212.57 0.01 2 1000 218.84 218.84 218.84 0.02 4 1000 209.84 209.84 209.84 0.04 8 1000 212.45 212.47 212.46 0.07 16 1000 208.90 209.15 209.03 0.15 32 1000 227.80 228.07 227.94 0.27 64 1000 223.61 223.62 223.62 0.55 128 1000 210.82 210.83 210.83 1.16 256 1000 211.61 211.61 211.61 2.31 512 1000 214.33 214.34 214.34 4.56 1024 1000 225.15 225.16 225.15 8.67 2048 1000 317.98 318.28 318.13 12.27 4096 1000 307.00 307.32 307.16 25.42 8192 1000 320.62 320.82 320.72 48.70 16384 1000 461.89 462.26 462.08 67.60 32768 1000 571.72 571.76 571.74 109.31 65536 640 1422.02 1424.80 1423.41 87.73 131072 320 1758.98 1759.17 1759.08 142.11 262144 160 4234.41 4234.99 4234.70 118.06 524288 80 5433.75 5453.23 5443.49 183.38 1048576 40 7511.45 7560.68 7536.06 264.53 2097152 20 12764.95 12818.46 12791.71 312.05 4194304 10 22333.29 22484.09 22408.69 355.81 # All processes entering MPI_Finalize
次に、DAPL ファブリックを使用するため https://www.openfabrics.org/downloads/ofed-mic/ofed-3.5-2-mic/ から OFED スタック OFED-3.5.2-MIC.gz をダウンロードし、インストールします (readme ファイルの 2.4 節を参照してください)。
OFED サービスを開始し、ファブリックを DAPL ファブリックに設定するため、プロバイダーとして ofa-v2-scif0 を使用します (/etc/dat.conf ファイルにすべての DAPL プロバイダーが示されます)。
# service openibd start
# service ofed-mic start
# service mpxyd start
DAPL を有効にし、DAPL プロバイダーを指定します。
# export I_MPI_FABRICS=dapl
# export I_MPI_DAPL_PROVIDER=ofa-v2-scif0
DAPL を設定した後、ホストと mic0 間のテストを繰り返します。環境変数 I_MPI_DEBUG が設定されていると、MPI プログラムの出力は通信に使用する基本プロトコルを使用して表示されることに注意してください。
# mpirun -genv I_MPI_DEBUG 2 -host localhost -n 1 /opt/intel/impi/5.0.1.035/bin64/IMB-MPI1 Sendrecv:\ -host mic0 -n 1 /tmp/IMB-MPI1
[0] MPI startup(): Single-threaded optimized library[0] DAPL startup(): trying to open DAPL provider from I_MPI_DAPL_PROVIDER: ofa-v2-scif0
[1] DAPL startup(): trying to open DAPL provider from I_MPI_DAPL_PROVIDER: ofa-v2-scif0
[0] MPI startup(): DAPL provider ofa-v2-scif0
[0] MPI startup(): dapl data transfer mode
[1] MPI startup(): DAPL provider ofa-v2-scif0
[1] MPI startup(): dapl data transfer mode
Sendrecv ベンチマーク:
#------------------------------------------------------------ # Intel (R) MPI Benchmarks 4.0, MPI-1 part #------------------------------------------------------------ # Date : Mon Nov 24 15:05:55 2014 # Machine : x86_64 # System : Linux # Release : 2.6.32-279.el6.x86_64 # Version : #1 SMP Wed Jun 13 18:24:36 EDT 2012 # MPI Version : 3.0 # MPI Thread Environment: # New default behavior from Version 3.2 on: # the number of iterations per message size is cut down # dynamically when a certain run time (per message size sample) # is expected to be exceeded. Time limit is defined by variable # "SECS_PER_SAMPLE" (=> IMB_settings.h) # or through the flag => -time # Calling sequence was: # /opt/intel/impi/5.0.1.035/bin64/IMB-MPI1 Sendrecv # Minimum message length in bytes: 0 # Maximum message length in bytes: 4194304 # # MPI_Datatype : MPI_BYTE # MPI_Datatype for reductions : MPI_FLOAT # MPI_Op : MPI_SUM # # # List of Benchmarks to run: # Sendrecv #-------------------------------------------------------------------------- # Benchmarking Sendrecv # #processes = 2 #-------------------------------------------------------------------------- #bytes #repetitions t_min[usec] t_max[usec] t_avg[usec] Mbytes/sec 0 1000 19.11 19.11 19.11 0.00 1 1000 20.08 20.08 20.08 0.09 2 1000 20.09 20.09 20.09 0.19 4 1000 20.19 20.19 20.19 0.38 8 1000 19.89 19.89 19.89 0.77 16 1000 19.99 19.99 19.99 1.53 32 1000 21.37 21.37 21.37 2.86 64 1000 21.39 21.39 21.39 5.71 128 1000 22.40 22.40 22.40 10.90 256 1000 22.73 22.73 22.73 21.48 512 1000 23.34 23.34 23.34 41.84 1024 1000 25.33 25.33 25.33 77.11 2048 1000 27.48 27.49 27.49 142.11 4096 1000 33.70 33.72 33.71 231.72 8192 1000 127.15 127.16 127.16 122.88 16384 1000 133.82 133.84 133.83 233.49 32768 1000 156.29 156.31 156.30 399.85 65536 640 224.67 224.70 224.69 556.30 131072 320 359.13 359.20 359.16 696.00 262144 160 174.61 174.66 174.63 2862.76 524288 80 229.66 229.76 229.71 4352.29 1048576 40 303.32 303.55 303.44 6588.60 2097152 20 483.94 484.30 484.12 8259.35 4194304 10 752.81 753.69 753.25 10614.46 # All processes entering MPI_Finalize
最後に mic0 と mic1 間のデータを収集するためベンチーマークを実行します。
# mpirun -genv I_MPI_DEBUG 2 -host mic0 -n 1 /tmp/IMB-MPI1 Sendrecv :-host mic1 -n 1 /tmp/IMB-MPI1
[0] MPI startup():Single-threaded optimized library[0] DAPL startup(): trying to open DAPL provider from I_MPI_DAPL_PROVIDER: ofa-v2-scif0
[1] DAPL startup(): trying to open DAPL provider from I_MPI_DAPL_PROVIDER: ofa-v2-scif0
[1] MPI startup():DAPL provider ofa-v2-scif0
[1] MPI startup(): dapl data transfer mode
[0] MPI startup():DAPL provider ofa-v2-scif0
[0] MPI startup(): dapl data transfer mode
#-------------------------------------------------------------------------- # Benchmarking Sendrecv # #processes = 2 #-------------------------------------------------------------------------- #bytes #repetitions t_min[usec] t_max[usec] t_avg[usec] Mbytes/sec 0 1000 30.13 30.13 30.13 0.00 1 1000 20.28 20.28 20.28 0.09 2 1000 20.43 20.43 20.43 0.19 4 1000 20.38 20.39 20.39 0.37 8 1000 20.70 20.70 20.70 0.74 16 1000 20.84 20.85 20.84 1.46 32 1000 21.79 21.80 21.79 2.80 64 1000 21.61 21.62 21.62 5.65 128 1000 22.63 22.63 22.63 10.79 256 1000 23.20 23.21 23.20 21.04 512 1000 24.74 24.74 24.74 39.47 1024 1000 26.14 26.15 26.15 74.69 2048 1000 28.94 28.95 28.94 134.95 4096 1000 44.01 44.02 44.01 177.49 8192 1000 149.33 149.34 149.34 104.63 16384 1000 192.89 192.91 192.90 162.00 32768 1000 225.52 225.52 225.52 277.13 65536 640 319.88 319.89 319.89 390.76 131072 320 568.12 568.20 568.16 439.99 262144 160 390.62 390.68 390.65 1279.81 524288 80 653.20 653.26 653.23 1530.78 1048576 40 1215.85 1216.10 1215.97 1644.61 2097152 20 2263.20 2263.70 2263.45 1767.02 4194304 10 4351.90 4352.00 4351.95 1838.24 # All processes entering MPI_Finalize
DAPL ファブリックを使用することで、MPI 帯域幅は大幅に向上しました。例えば、メッセージ長が 4M バイトの場合、ホスト・プロセッサーの帯域幅は 465.28MB/秒から 10614.46MB/秒に、そしてコプロセッサーの帯域幅は 355.81MB/秒から 1838.24MB/秒になりました。このパフォーマンスの改善は、InfiniBand* HCA がインストールされているか否かにかかわらず、OFED スタックをインストールして DAPL を構成、そして有効にすることでのみで達成されています。
性能に関するテストに使用されるソフトウェアとワークロードは、性能がインテル® マイクロプロセッサー用に最適化されていることがあります。SYSmark* や MobileMark* などの性能テストは、特定のコンピューター・システム、コンポーネント、ソフトウェア、操作、機能に基づいて行ったものです。結果はこれらの要因によって異なります。製品の購入を検討される場合は、他の製品と組み合わせた場合の本製品の性能など、ほかの情報や性能テストも参考にして、パフォーマンスを総合的に評価することをお勧めします。
** このサンプルコードは、BSD 3 項ライセンスの下で公開されています。
© 2012-2013 Intel Corporation. 無断での引用、転載を禁じます。
コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください