在Xeon Phi上运行Erlang

时间:2015-09-21 19:49:52

标签: erlang cross-compiling xeon-phi beam

如何编译VM并在Intel Xeon Phi协处理器上运行Erlang程序?

1 个答案:

答案 0 :(得分:3)

Intel Xeon Phi不是典型的x86_64架构,因此无法在其上运行官方Erlang VM。唯一的方法是使用cross-compilation并在支持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(mfencelfencesfence)不支持这些子句。这可以归结为打开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 Compiler,并且需要-mmic标记来编译Xeon Phi。 hostbuild标志分别是您编译的机器和为其编译的机器(Phi)的系统/体系结构。在我的例子中,他们有以下值,但如果它不同,您可能希望使用config.guess脚本自动检测您的OS / CPU架构。

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

那就是它!现在你应该能够在你的Phi上运行并运行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