Константин Рядов Инженер JVM, ушедший в инженерию ИИ. То, что я сделал.

Сопроцессор Intel® Xeon Phi

Уже год как Intel представила первое поколение сопроцессоров Xeon Phi. Что же это за зверь? Давайте разберемся.

Intel Xeon Phi

Со слов википедии Xeon Phi - ребрендинг имплементации технологии Intel MIC (англ. Intel Many Integrated Core Architecture), архитектура многоядерной процессорной системы, разработанная Intel с использованием наработок архитектур Larrabee, Teraflops Research Chip, Intel Single-chip Cloud Computer.

В 2013 году вышло второе поколение - в максимальной конфигурации сопроцессоры Xeon Phi 7120P/7120X оперируют 61 ядром, обрабатывающим данные в 244 потока и работающим на частоте 1,23/1,33 ГГц (обычный режим/турбо).

Предложение звучит особенно заманчиво для разработчиков многопоточных приложений и всяких там кластерных вычислений, учитывая, что Xeon Phi - "карточка" шины PCI-Express. Взял Xeon, добавил пару Phi-карт и сделал себе суперкомпьютер. Добавим к этому пару крупных компаний, выпускающих готовые решения, - SuperMicro, Dell - и можно, казалось бы даже, выйти в Production.

Intel Xeon Phi, карта PCIe

Рассмотрим главный вопрос - что собственно достается разработчику? Читаем Quick Start Guide с сайта Intel:

Архитектура Xeon Phi

Итак:

  1. Берем RHEL 6 (ядро не ниже 2.6.32-131) или SLES 11 (ядро не ниже 3.0.13-0.27) - и, похоже, больше из OS ничего не подойдет
  2. Ставим последние драйвера с Intel, обновляем Flash на самом Phi
  3. Запускаем сервис mpss
  4. Покупаем или закачиваем бесплатно компоненты Software Development Tools, устанавливаем
  5. Проверяем "тестовым" (/opt/intel/composerxe/Samples/en_US/C++/mic_sample), что карточка(и) работают корректно
  6. Опционально включаем сбор статистики производительности
  7. Проверяем статус (/opt/intel/mic/bin/micsmc)
  8. Готовы к работе

Интересным мне показался комментарий - "если ваш(и) Phi завис(ли) или не работает(ют), остановите, выгрузите и запустите сервис mpss".

Как же собственно "добраться" до сопроцессора?

Путь №1 меня несколько удивил: зайдите по SSH и можете выполнять "many common Linux commands". Соответственно, передача файлов по "scp".

IP-шники назначаются так: 172.31.<coprocessor>.254, или как алиас-хосты mic<coprocessor>. Собс-но:

weinberg@knf1:~> ssh mic0
[weinberg@knf1-mic0 weinberg]$ hostname
knf1-mic0
[weinberg@knf1-mic0 weinberg]$ cat /etc/issue
Intel MIC Platform Software Stack release 2.1
Kernel 2.6.34.11-g65c0cd9 on an k1om

Возникает вопрос - зачем до него добираться? Оказывается, мы можем выполнить (ssh) наш скомпилированный бинарник прямо внутри Phi, предварительно туда его закачав (scp).

Путь №2 через соответствующие бинарники mic* из пакета драйверов.

Наконец-то дошли до разработки - нам доступны:

  • Compilers
    • Intel C++ Composer XE 2013 for building applications that run on Intel® 64 architecture and Intel® MIC Architecture
    • Intel® Fortran Composer XE 2013 for building applications that run on Intel® 64 architecture and Intel® MIC Architecture
  • Libraries packaged with the compilers include:
    • Intel® Math Kernel Library (Intel® MKL) optimized for the Intel® MIC Architecture
    • Intel® Threading Building Blocks (Intel® TBB)
    • Intel® Integrated Performance Primitive (Intel® IPP)
  • Libraries packaged separately include:

С кучей флагов компилятора, линкера и окружения для собственно запуска.

Собственно код:

float reduction(float *data, int size) {
    float ret = 0.f;
    for (int i=0; i<size; ++i) {
        ret += data[i];
    }
    return ret;
}

Оптимизируется до:

float reduction(float *data, int size) {
    float ret = 0.f;
    #pragma offload target(mic) in(data:length(size))
    for (int i=0; i<size; ++i) {
        ret += data[i];
    }
    return ret;
}

Или даже до:

float reduction(float *data, int size) {
    float ret = 0;
    #pragma offload target(mic) in(data:length(size))
    ret = __sec_reduce_add(data[0:size]); //Intel® Cilk™ Plus Extended Array Notation
    return ret;
}

Возникает вопрос - собственно, какого ускорения ожидать? Чисто логически, на том же Xeon Phi 7120P/7120X, который оперирует 61 ядром и обладает, видимо, еще и группой конвейеров на каждом ядре, ускорение на сложении должно быть никак не менее, чем в 61 раз (Кэп, привет!).

Помимо "ускорения" сложения массивов присутствует настоящая поддержка многопоточности для "числодробления" и много чего еще, включая OpenMP. Также радует возможность написания кода, работающего и с Phi, и без Phi.

Чего собственно, IMHO, не хватает?

  1. Поддержки Java и "других языков" вкупе со сниппетами и, возможно, фреймворками (а не только C/C++ и Fortran)
  2. Поддержки не-Linux OS

P.S. Отдельный вопрос цены "минимальной карточки" за 100 кило-рублей оставим за рамками этого обзора.

P.P.S. Прямой конкурент Phi - Nvidia Tesla


Впервые опубликовано в ЖЖ.

Все записи