Запуск Erlang на Xeon Phi

Как скомпилировать виртуальную машину и запустить программы Erlang на сопроцессоре Intel Xeon Phi?


person stpk    schedule 21.09.2015    source источник


Ответы (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
person stpk    schedule 21.09.2015
comment
Несмотря на то, что Knights Corner работает по порядку, поэтому загрузка и сохранение обычно завершаются по порядку, вам нужна как минимум защита от компилятора, чтобы компилятор не перемещал их. Поэтому вы должны иметь asm volatile (:::memory) на стороне MIC вашего ifdef. Кроме того, если у вас есть код, который использует хранилища NGO, вы должны вставить настоящую mfence после них, чтобы гарантировать их завершение, что вы можете эмулировать с помощью asm volatile(lock; addl $0,(%%rsp): :Память). - person Jim Cownie; 24.09.2015
comment
Привет, @stpk, какую версию ICC ты используешь? Composer, Pro и т. д. Не думаю, что смогу уговорить вас на бинарный дроп. Я хотел бы проверить, насколько хорошо он работает на ICC по сравнению с компилятором с открытым исходным кодом с менее надежной поддержкой, прежде чем выяснять, нужно ли мне выкладывать большие деньги и некоторые изменения для параллельного xe pro. У меня нет тонны свободного времени для отладки и т. д. до конца года. Поэтому я с подозрением отношусь к простой подписке на бесплатную пробную версию, пока не увижу, насколько хорошо все работает. - person Keith Brings; 28.09.2015
comment
@JimCownie поддерживает ли ICC asm volatile ("":::"memory") инструкции? В Википедии я обнаружил, что следует использовать __memory_barrier(). Кроме того, есть ли простой способ проверить, использует ли код Erlang VM какие-либо хранилища NGO? - person stpk; 22.10.2015
comment
@stpk Компилятор Intel (в unix-подобных ОС) поддерживает встроенный синтаксис asm gcc. Я думаю, что если вы используете _mm_mfence(), она сгенерирует инструкцию mfence, которая (как мы уже обсуждали) не существует в KNC. - person Jim Cownie; 23.10.2015
comment
@stpk Существует несколько способов поиска магазинов НПО (выполните код в SDE software.intel.com/en-us/articles/ НО ни один инструмент времени выполнения не может подтвердить, что в коде нет экземпляров инструкции, которая могла бы быть выполнена с каким-либо другим вводом. вам было бы гораздо лучше проверить исходный код виртуальной машины Erlang, чтобы увидеть, есть ли они (те, что в библиотеках, таких как libc, в любом случае должны быть должным образом защищены, поэтому вам не нужно о них беспокоиться). - person Jim Cownie; 23.10.2015
comment
@Keith Brings Если вы занимаетесь разработкой с открытым исходным кодом, вы сможете бесплатно получить компиляторы Intel. software.intel.com/en-us/qualify-for- бесплатное программное обеспечение/ - person Jim Cownie; 23.10.2015