Как скомпилировать виртуальную машину и запустить программы Erlang на сопроцессоре Intel Xeon Phi?
Запуск Erlang на Xeon Phi
Ответы (1)
Intel Xeon Phi не является типичной архитектурой x86_64, поэтому на нем невозможно запустить официальную виртуальную машину Erlang. Единственный способ сделать это — использовать кросс-компиляция и собрать виртуальную машину самостоятельно на другой (хост) машине, где поддерживается Erlang, чтобы она работала в целевой системе (в данном случае Phi).
Xeon Phi также поддерживает немного другой набор инструкций, чем типичная архитектура x86_64, поэтому вам также необходимо отредактируйте код. Если вы просто кросс-компилируете виртуальную машину, не касаясь кода, вы, вероятно, получите ошибку:
/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
вокруг __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, а флаг -mmic
требуется для компиляции для Xeon Phi. Флаги host
и build
— это системы/архитектуры соответственно машины, на которой вы компилируете, и машины, для которой вы компилируете (Phi). В моем случае они имели следующие значения, но если для вас они отличаются, вы можете использовать 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")
инструкции? В Википедии я обнаружил, что следует использовать __memory_barrier()
. Кроме того, есть ли простой способ проверить, использует ли код Erlang VM какие-либо хранилища NGO?
- person stpk; 22.10.2015