【发布时间】:2015-09-21 19:49:51
【问题描述】:
如何编译 VM 并在 Intel Xeon Phi 协处理器上运行 Erlang 程序?
【问题讨论】:
标签: erlang cross-compiling xeon-phi beam
如何编译 VM 并在 Intel Xeon Phi 协处理器上运行 Erlang 程序?
【问题讨论】:
标签: erlang cross-compiling xeon-phi beam
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 不支持这些指令(mfence、lfence 和sfence)。这归结为打开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 编译所必需的。 host 和 build 标志分别是你编译的机器和你编译的机器(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
【讨论】:
asm volatile ("":::"memory") 指令?在Wikipedia 上,我发现应该使用__memory_barrier()。此外,是否有一种简单的方法可以检查 Erlang VM 代码是否使用任何 NGO 商店?