Опубликован: 30.05.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Нижегородский государственный университет им. Н.И.Лобачевского

Самостоятельная работа 1: Компиляция и запуск приложений на Intel Xeon Phi

< Лекция 5 || Самостоятельная работа 1: 123456 || Самостоятельная работа 2 >

Режим исполнения на сопроцессоре

Модель программирования в "родном" режиме сопроцессора предполагает исполнение кода только на Intel Xeon Phi вообще без использования центрального процессора. С точки зрение написания кода эта модель ничем не отличается от программирования под CPU, различия видны только на этапах компиляции и запуска.

Скалярное произведение векторов на одном сопроцессоре

Запустим рассмотренную выше задачу скалярного умножения векторов на сопроцессоре. Исходный код программы приведен ниже:

#include <stdio.h>
#include <stdlib.h>

float dot(float* a, float* b, int n)
{
    float res = 0;

    #pragma omp parallel for reduction(+: res)
    for (int i = 0; i < n; ++i)
    {
        res += a[i]*b[i];
    }

    return res;
}

int main()
{
    int n = 100;
    float* a = new float[n];
    float* b = new float[n];
    float res;

    for (int i = 0; i < n; ++i)
    {
        a[i] = (float)rand()/RAND_MAX;
        b[i] = (float)rand()/RAND_MAX;
    }

    res = dot(a, b, n);
    printf("Result: %f\n", res);

    delete[] a;
    delete[] b;

    return 0;
}

Как видите, код ничем не отличается от "обычного", предназначенного для центрального процессора.

Для компиляции этой программы необходимо выполнить команду:

icc -02 –openmp -mmic main.cpp –o lab1_dot_native.mic

Обратите внимание на новый ключ компиляции, -mmic, который говорит о том, что компиляция будет производиться для сопроцессора. Полученный в результате исполняемый файл может быть запущен только на устройствах с архитектурой MIC, на центральном процессоре он работать не будет.

Для запуска программы можно скопировать исполняемый файл на сопроцессор и запустить его там обычным способом. А можно воспользоваться утилитой MPI Hydra:

mpiexec.hydra –host mic0 –n 1 –perhost 1
 ./lab1_dot_native.mic

Здесь параметр –host должен указывать на имя сопроцессора (сопроцессоры в данной схеме являются отдельными MPI узлами), -n – общее число процессов, -perhost – число процессов на узел.

Для запуска программы на кластере с системой управления кластером SLURM необходимо воспользоваться командой sbatch:

sbatch –N 1 –-gres=mic:2 native_run.sh ./lab1_dot_native

Параметр –N задает число узлов, на которых будет выполнена ваша программа. Ключ --gres=mic:2 говорит о необходимости выделить для расчетов узел кластера с минимум двумя сопроцессором Intel Xeon Phi. Имя логического раздела с узлами кластера, где установлены сопроцессоры, можно задать ключом –p. Обратите внимание, что исполняемый файл задается без расширения .mic.

Число MIC процессов на узел по умолчанию зависит от настроек конкретного кластера, обычно оно равно числу доступных сопроцессоров на узле. Т.е. в данном случае программа будет выполнена в два процесса, каждый из которых займет свой сопроцессор.

Приведенная выше команда ставит задачу в очередь. При успешном выполнении будет выведено сообщение о постановке в очередь задачи с определенным номером. Посмотреть состояние задачи можно командой:

squeue

По завершении задачи в директории с исполняемым файлом будет создан файл slurm-<номер задачи>.out, куда запишется консольный вывод нашей программы. Посмотреть содержимое этого файла можно командой:

cat slurm-<номер задачи>.out

Результат работы нашей программы приведен на рис. 6.5. Как видите, результат не отличается от скалярного произведения, вычисленного с помощью предыдущей программы.

Результаты работы программы lab1_dot_native

Рис. 6.5. Результаты работы программы lab1_dot_native

Скрипт native_run.sh установлен в системе, но для его использования необходимо предварительно выполнить команду:

module load launcher/mic

Эта команда подгружает модуль launcher/mic, делая видимыми скрипты запуска задач на сопроцессоре, такие как native_run.sh. Загрузить указанный модуль достаточно один раз в том случае, если он еще не используется. Список используемых в текущий момент модулей можно узнать, воспользовавшись командой:

module list

Модуль остается загруженным на все время текущей сессии.

Рассмотрим также один из возможных способов задания точного числа MIC процессов на узел. Он состоит в использовании специальных переменных окружения. Конкретные имена переменных зависят от настроек того или иного кластера и обычно указаны в соответствующем руководстве пользователя. Пусть, например, число MIC процессов на узел задается переменной окружения MICperNODE. Тогда, чтобы запустить программу в 1 MIC процесс на одном узле, нужно выполнить команды:

export MICperNODE=1
sbatch –N 1 –-gres=mic:2 native_run.sh ./lab1_dot_native

После этого программа будет использовать по одному сопроцессору с каждого из узлов кластера.

< Лекция 5 || Самостоятельная работа 1: 123456 || Самостоятельная работа 2 >
Svetlana Svetlana
Svetlana Svetlana

Здравствуйие! Я хочу пройти курс Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi), в презентации самостоятельной работы №1 указаны логин и пароль для доступ на кластер и выполнения самостоятельных работ, но войти по такой паре логин-пароль не получается. Как предполагается выполнение самосоятельных работ в этом курсе?

Егор Кузьмин
Егор Кузьмин
Россия, г. Москва
Вера Борисова
Вера Борисова
Россия