3

インテル Xeon Phiコプロセッサーで VM をコンパイルし、Erlang プログラムを実行するにはどうすればよいですか?

4

1 に答える 1

3

Intel Xeon Phi は典型的な x86_64 アーキテクチャではないため、公式の Erlang VM を実行することはできません。これを行う唯一の方法は、クロスコンパイルを使用して、Erlang がサポートされている別の (ホスト) マシンで自分で VM をビルドして、ターゲット システム (この場合は Phi) で実行することです。

Xeon Phi は、一般的なx86_64アーキテクチャとは少し異なる命令セットもサポートしているため、コードを編集する必要もあります。コードに触れずに VM をクロスコンパイルすると、おそらくエラーが発生します。

/tmp/iccvaLP3vas_.s: Assembler messages:
/tmp/iccvaLP3vas_.s:25794: Error: `mfence' is not supported on `k1om'

そのため、まず#ifndefメモリ フェンス命令の前後に節を追加する必要がありますが、これは Phi ( mfencelfenceおよびsfence) ではサポートされていません。これは、ファイルを開き、erts/include/internal/i386/ethr_membar.h次のプリプロセッサ ディレクティブを追加することに要約されます。

#ifndef __MIC__
...
#endif

__asm__関数内のステートメントの周りethr_mfence__ethr_sfence__およびethr_lfence__

static __inline__ void
ethr_mfence__(void)
{
#if ETHR_SIZEOF_PTR == 4
    if (ETHR_X86_RUNTIME_CONF_HAVE_NO_SSE2__)
        ETHR_NO_SSE2_MEMORY_BARRIER__;
    else
#endif
#ifndef __MIC__
    __asm__ __volatile__ ("mfence\n\t" : : : "memory");
#endif
}

これで、クロスコンパイルを試すことができます。最初にソース (私の場合は Erlang VM 17.5) をダウンロードしてから、次を実行します。

$ cd otp_src_17.5
$ export ERL_TOP=`pwd`;
$ ./configure \
    --host=k1om-unknown-linux-gnu \
    --build=x86_64-pc-linux-gnu \
    --without-termcap \
    --without-javac \
    --without-ssl \
    --prefix=/path/to/my/new_installation \
    CC=icc \
    CFLAGS=-mmic \
    LDFLAGS=-mmic \
    DED_LD=icc \
    DED_LDFLAGS="-mmic -shared -Wl,-Bsymbolic" \
    DED_LD_FLAG_RUNTIME_LIBRARY_PATH="-Wl,-R"
$ make
$ make install

iccは公式のIntel コンパイラであり-mmic、Xeon Phi 用のコンパイルにはフラグが必要です。hostおよびbuildフラグは、それぞれコンパイルするマシンとコンパイルするマシン (Phi) のシステム/アーキテクチャです。私の場合、次の値がありましたが、それが異なる場合は、OS/CPU アーキテクチャを自動的に検出するconfig.guessスクリプトを使用することをお勧めします。

$ ./config.guess
$ x86_64-pc-linux-gnu

以上です!これで、Phi で ssh して Erlang を実行できるはずです。

$ ssh my-phi-coprocessor
$ cd /path/to/my/new_installation/
$ export PATH=`pwd`/bin:$PATH;
$ erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 6.4
于 2015-09-21T19:49:51.777 に答える