【问题标题】:Running Erlang on Xeon Phi在 Xeon Phi 上运行 Erlang
【发布时间】:2015-09-21 19:49:51
【问题描述】:

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

【问题讨论】:

    标签: erlang cross-compiling xeon-phi beam


    【解决方案1】:

    Intel Xeon Phi 不是典型的 x86_64 架构,因此无法在其上运行官方的 Erlang VM。唯一的方法是使用 cross-compilation 并在支持 Erlang 的不同(主机)机器上自己构建 VM,以便它在目标系统(本例中为 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
    

    在函数ethr_mfence__ethr_sfence__ethr_lfence__ 中围绕__asm__ 语句,例如

    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)的系统/架构。在我的情况下,它们具有以下值,但如果对您而言不同,您可能希望使用自动检测您的操作系统/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
    

    【讨论】:

    • 虽然 Knights Corner 是一个有序的机器,所以加载和存储通常是按顺序完成的,你至少需要一个编译器栅栏来确保编译器没有移动它们。因此,您应该在 ifdef 的 MIC 端有一个 asm volatile ("":::"memory")。此外,如果您有使用 NGO 商店的代码,您应该在这些代码之后插入一个真正的 mfence 以确保其完成,您可以使用 asm volatile("lock; addl $0,(%%rsp) 进行模拟"::"记忆")。
    • 嘿@stpk 你使用的是哪个版本的ICC? Composer、Pro 等。我不认为我可以说服你成为二进制文件。在确定是否需要为并行 xe pro 进行重大更改之前,我想检查一下它在 ICC 上的性能与支持不太强大的开源编译器的性能如何。直到今年晚些时候,我都没有大量空闲时间进行调试等。因此,在我大致了解情况如何运作之前,我对注册免费试用持怀疑态度。
    • @JimCownie ICC 是否支持asm volatile ("":::"memory") 指令?在Wikipedia 上,我发现应该使用__memory_barrier()。此外,是否有一种简单的方法可以检查 Erlang VM 代码是否使用任何 NGO 商店?
    • @stpk intel 编译器(在类 unix 操作系统上)支持 gcc 内联 asm 语法。我认为如果你使用 _mm_mfence() 它将生成一个 mfence 指令(正如我们已经讨论过的那样)在 KNC 上不存在。
    • @stpk 有多种方法可以查找 NGO 商店,(在 SDE software.intel.com/en-us/articles/… 下执行代码,但是没有运行时工具可以证明代码中没有指令实例可以使用其他输入执行。所以你最好检查一下 Erlang VM 的源代码,看看它是否有。(无论如何,像 libc 这样的库中的那些应该得到适当的保护,所以你不必担心他们)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多