インテル® Xeon® プロセッサー・ベースのホストとインテル® Xeon Phi™ コプロセッサー間の MPI 通信の改善

同カテゴリーの次の記事

Windows* ホスト上でインテル® Xeon Phi™ コプロセッサー向けアプリケーションをデバッグする

この記事は、インテル® デベロッパー・ゾーンに公開されている「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. 無断での引用、転載を禁じます。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください

関連記事

  • 2015 年春のインテル® ソフトウェア技術ウェビナーシリーズ2015 年春のインテル® ソフトウェア技術ウェビナーシリーズ 無料のインテル® ソフトウェア技術ウェビナーシリーズ 2015 年春のインテル® ソフトウェア技術ウェビナーが開催されました — 皆さんがご覧になって、開発に役立てられることを期待しています。 このウェビナーシリーズの概要紹介をご覧ください。(英語) > 2015 […]
  • Parallel Universe マガジンParallel Universe マガジン Parallel Universe へようこそ。 米国インテル社が四半期に一度オンラインで公開しているオンラインマガジンです。インテルの技術者によるテクノロジーの解説や、最新ツールの紹介など、並列化に関する記事を毎号掲載しています。第1号からのバックナンバーを PDF 形式で用意しました、ぜひご覧ください。 12 […]
  • インテル® MPI を使用した並列化インテル® MPI を使用した並列化 この記事は、インテル® ソフトウェア・サイトに掲載されている「Parallelization Using Intel® MPI」の日本語参考訳です。 ここでは、インテル® Composer XE Linux* 版におけるインテル® MPI のサポートについて説明します。 はじめに インテル® Composer XE 2013 […]
  • mpitune ユーティリティーの実行時間を軽減するmpitune ユーティリティーの実行時間を軽減する この記事は、インテル® デベロッパー・ゾーンに公開されている「Reducing the runtime of mpitune」の日本語参考訳です。 インテル® MPI ライブラリーには、インテル® MPI ライブラリー自身の実行パラメーターを最適化するのを支援するツール mpitune が含まれています。mpitune […]
  • ヘテロジニアス分散システムにおける有限差分法ヘテロジニアス分散システムにおける有限差分法 この記事は、インテル® デベロッパー・ゾーンに公開されている「Finite Differences on Heterogeneous Distributed Systems」の日本語参考訳です。 この記事の PDF 版はこちらからご利用になれます。 ソースコードのダウンロード (zip […]