如何在Intel Xeon Phi协处理器上编译VM并运行Erlang程序?
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( mfence , lfence 和 sfence )上不受支持 . 这可以归结为打开 erts/include/internal/i386/ethr_membar.h 文件并添加以下预处理程序指令:
#ifndef
mfence
lfence
sfence
erts/include/internal/i386/ethr_membar.h
#ifndef __MIC__ ... #endif
函数 ethr_mfence__ , ethr_sfence__ 和 ethr_lfence__ 中的 __asm__ 个陈述
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)的系统/体系结构 . 在我的情况下,它们具有以下值,但如果它与您不同,您可能希望使用自动检测OS / CPU体系结构的config.guess脚本 .
icc
-mmic
host
build
$ ./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
1 回答
Intel Xeon Phi不是典型的x86_64架构,因此无法在其上运行官方Erlang VM . 唯一的方法是使用cross-compilation并在支持Erlang的不同(主机)机器上自己构建VM,以便它在目标系统上运行(在本例中为Phi) .
Xeon Phi还支持与典型的x86_64架构略有不同的指令集,因此您还需要编辑代码 . 如果您只是在不触及代码的情况下交叉编译VM,则可能会收到错误:
首先,您需要在内存栅栏指令周围添加
#ifndef
子句,这些指令在Phi(mfence
,lfence
和sfence
)上不受支持 . 这可以归结为打开erts/include/internal/i386/ethr_membar.h
文件并添加以下预处理程序指令:函数
ethr_mfence__
,ethr_sfence__
和ethr_lfence__
中的__asm__
个陈述现在您可以尝试交叉编译它 . 首先下载源代码(在我的案例中是Erlang VM 17.5),然后运行:
icc
是官方Intel Compiler和-mmic
标志是编译Xeon Phi所必需的 .host
和build
标志分别是您编译的机器和为其编译的机器(Phi)的系统/体系结构 . 在我的情况下,它们具有以下值,但如果它与您不同,您可能希望使用自动检测OS / CPU体系结构的config.guess脚本 .就是这样!现在你应该能够在你的Phi上运行并运行Erlang .