erlang - 在 Xeon Phi 上运行 Erlang

标签 erlang cross-compiling xeon-phi beam

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

最佳答案

Intel Xeon Phi 不是典型的 x86_64 架构,因此不可能在其上运行官方的 Erlang VM。唯一的方法是使用 cross-compilation并在支持 Erlang 的不同(主机)计算机上自行构建 VM,以便它在目标系统(本例中为 Phi)上运行。

至强融核还支持与典型 x86_64 略有不同的指令集架构,因此您还需要编辑代码。如果您只是交叉编译虚拟机而不接触代码,您可能会收到错误:

/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 flags 分别是您编译的机器和您为其编译的机器 (Phi) 的系统/体系结构。就我而言,它们具有以下值,但如果对您来说不同,您可能需要使用 config.guess自动检测您的操作系统/CPU 架构的脚本。

$ ./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

关于erlang - 在 Xeon Phi 上运行 Erlang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703379/

相关文章:

math - 如何在Erlang中计算5 ^ 262144

erlang - 何时在 Erlang/OTP 应用程序中使用 gen_server

c - #include 守卫不起作用,#pragma Once 已过时

c - 返回 64 位整数中所有设置位的位置的最快方法是什么?

c++ - 如何在 pyMIC 中为 Xeon Phi 编译 knn

erlang - 从 Vernemq 插件发布消息

erlang - 在 erlang 中构建堆栈

windows - Perl 到 Linux 上的静态可执行文件

c++ - 交叉编译到 Raspberry Pi 时如何在 Visual Studio 中添加包含目录?

c - Intel Xeon Phi 上的快速人口统计