<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Курс "Программирование и оптимизация для архитектуры Intel Xeon Phi"*</article-title>
      </title-group>
      <pub-date>
        <year>2015</year>
      </pub-date>
      <fpage>763</fpage>
      <lpage>772</lpage>
      <abstract>
        <p>В работе обсуждается проблема обучения программированию для Intel Xeon Phi. Представлен практико-ориентированный подход к обучению, основанный на обширном лабораторном практикуме. Отличительной особенностью подхода является комбинация классических задач на освоение концепций и приемов параллельного программирования и реальных примеров, возникших при решении научных задач финансовой математики и вычислительной физики. В работе приведено описание разработанного курса «Программирование для Intel Xeon Phi», представлена информация об опыте его прочтения. Материалы курса на русском языке выложены в открытый доступ на сайте www.intuit.ru [1-2].</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>гда, а там, где возможно, нередко требует существенных знаний и навыков. Обсуждению
вопроса об обучении программирования для Xeon Phi и посвящена данная работа.</p>
      <p>В работе приводится описание подхода к обучению программированию на XeonPhi,
разработанному в ННГУ при финансовой поддержке компании Intel. Отличительной особенностью
указанного подхода является практико-ориентированное преподавание, сочетающее как
классические примеры на организацию параллельных вычислений (матричные операции,
сортировки и другие), так и авторские разработки, выросшие из реальных научных проектов из разных
предметных областей (финансовая математика, вычислительная физика), выполняемых в
университете. Работа построена следующим образом. В разделе 2 рассмотрены некоторые
аналогичные работы. В разделе 3 дана краткая характеристика методики преподавания. В разделе 4
приведен учебно-тематический план лекционной части курса «Программирование для Intel
Xeon Phi». В разделе 5 приведена информация об организации лабораторного практикума. В
разделе 6 дана краткая характеристика методики оценки знаний обучаемых. В разделе 7
представлен опыт чтения курса на факультете ВМК ННГУ. В заключении приведено описание
основных результатов и планов по их дальнейшему развитию.</p>
      <p>Область высокопроизводительных вычислений развивается очень интенсивно, практически
каждый год происходит обновление актуальной совокупности аппаратных средств, технологий
программирования и инструментальных средств, которыми должен владеть разработчик
HPCприложений. Подготовка высококвалифицированных специалистов в данной области требует
формирования комплексных учебных программ, охватывающих различные аспекты обучения,
и в то же время позволяющих оперативно их дополнять при появлении новых технологий. При
появлении архитектуры Xeon Phi различные вузы использовали следующие основные подходы.</p>
      <p>
        – Включение информации об архитектуре Xeon Phi и особенностях программирования для
него в существующие курсы по архитектуре ЭВМ, параллельному программированию или
смежным с ними [
        <xref ref-type="bibr" rid="ref13 ref14 ref15 ref16">14-17</xref>
        ].
      </p>
      <p>
        Структура и содержание подобных курсов достаточно стандартны, поскольку широко
обсуждались академическим сообществом и описаны в ряде разработанных рекомендаций (ACM
Computer Science Curricula 2013 [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], NSF/IEEE-TCPP Curriculum Initiative [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], Свод знаний и
умений в области СКТ [5] и т.п.) Архитектура Intel Xeon Phi использует элементы архитектуры
Intel Pentium (P54C) и проекта Larrabee, и его изучение в рамках указанных курсов является
естественным и обычно включает обзор аппаратных возможностей с обсуждением специфики,
рассмотрение моделей программирования и обсуждение примеров решения задач.
– Привлечение сторонних организаций для прочтения курса.
      </p>
      <p>
        Существует ряд организаций, разработавших курс или комплект курсов по
программированию для Intel Xeon Phi и выполняющих обучение по данной теме по запросу [
        <xref ref-type="bibr" rid="ref17 ref18">18-19</xref>
        ]. В
первую очередь, этим занимается сама компания Intel, подготовившая большой комплект учебных
материалов и организовывающая обучение на многих мероприятиях, связанных с
высокопроизводительными вычислениями [
        <xref ref-type="bibr" rid="ref19">20</xref>
        ], либо своими силами, либо с привлечением
преподавателей из университетов. Обычно такие курсы читаются в форме мастер-классов с практическими
занятиями, позволяющей за короткое время изучить особенности архитектуры и моделей
программирования и попробовать их на практике.
      </p>
      <p>
        – Разработка отдельного курса по программированию для Xeon Phi [
        <xref ref-type="bibr" rid="ref1 ref2 ref20 ref21 ref22 ref23 ref24 ref25">1-2, 21-26</xref>
        ].
В большинстве случаев подобный курс разрабатывается подразделением, занимающимся
высокопроизводительными вычислениями, и проводится в форме мастер-классов и
практических занятий. Но существуют и курсы классического типа (лекции + практика/лабораторные
работы), в которых основное внимание уделяется практической части.
      </p>
      <p>На наш взгляд все перечисленные подходы являются приемлемыми, и выбор зависит от
структуры программы обучения в целом и целей обучения.</p>
      <p>
        Основными источниками информации, использованными нами при разработке курса
"Программирование и оптимизация для архитектуры Intel Xeon Phi" являлись:
– сайт компании Intel (разработчик архитектуры), содержащий техническую
документацию, учебные материалы и статьи разработчиков [
        <xref ref-type="bibr" rid="ref26 ref27 ref28 ref29 ref30 ref31 ref32">27-33</xref>
        ];
– редкие статьи и книги, посвященные программированию для Intel Xeon Phi [
        <xref ref-type="bibr" rid="ref33 ref34 ref35">34-36</xref>
        ];
– наш собственный опыт разработки и переноса приложений в вычислительной физике и
финансовой математике для Intel Xeon Phi.
      </p>
      <p>
        Последняя из книг – "High Performance Parallelism Pearls: Multicore and Many-core
Programming Approaches" [
        <xref ref-type="bibr" rid="ref35">36</xref>
        ] – включает главу 19 "Performance optimization of black-scholes
pricing", подготовленную с участием двоих разработчиков представляемого курса.
3. Методика преподавания
      </p>
      <p>Курс был разработан в нескольких вариантах - на русском и английском языках, в виде
единого курса и разбитого на базовую и расширенную части, в виде модулей для
представления на мероприятиях и мастер-классах. Далее мы будем рассматривать наиболее полный
вариант курса.</p>
      <p>Основная цель курса – изучить базовые принципы и сформировать навыки разработки
программ, ориентированных на эффективное использование Intel Xeon Phi. При этом решаются
следующие задачи:</p>
      <p>– Изучение особенностей архитектуры Intel Xeon Phi, а также основных механизмов,
влияющих на производительность программ.</p>
      <p>– Изучение моделей использования Intel Xeon Phi, а также соответствующего системного
программного обеспечения. Освоение способов разработки, сборки и запуска приложений на
Intel Xeon Phi.</p>
      <p>– Изучение принципов и особенностей применения технологий параллельного
программирования для разработки и оптимизации расчетных программ, ориентированных на Intel Xeon
Phi, включая вопросы использования инструкций SIMD, технологий OpenMP и Cilk Plus.</p>
      <p>– Формирование навыков оптимизации и векторизации расчетных циклов, оптимизации
работы с памятью, балансировки нагрузки при распараллеливании.</p>
      <p>–Ознакомление с достаточно успешными примерами оптимизации программ, изначально
не совсем подходящих для эффективного использования возможностей Intel Xeon Phi.
Курс рассчитан на 32 часа, в том числе:
– 10 часов лекций, на которых рассматриваются архитектура процессора, модели
организации вычислений и подходы к оптимизации программ (см. п.4.);</p>
      <p>– 10 часов практических занятий, которые могут проводиться в режиме лабораторных
работ (слушатели пошагово выполняют задания под руководством инструктора или
самостоятельно решают поставленную задачу, при необходимости пользуясь советами и подсказками
преподавателя) либо в режиме мастер-классов (инструктор пошагово показывает то, что
необходимо сделать, давая необходимые пояснения); темы лабораторных работ приведены в п.5;
– 12 часов выделяется на самостоятельную работу, в ходе которой студент должен
выполнить практические домашние задания, а также выпускную работу, связанную с оптимизацией
некоторого алгоритма для Intel Xeon Phi; примером задания для выпускной работы является
достижение 50% от максимальной производительности в задаче умножения плотных матриц.</p>
      <p>Для оценки знаний студентов используется система тестирования (см.п.6), и просмотр
выполненных ими домашних заданий и выпускной работы.</p>
      <p>
        Все материалы курса были разработаны на русском и английском языках. Русскоязычная
версия курса представлена на сайте Интуит в виде двух связанных курсов для базового и
продвинутого уровня [
        <xref ref-type="bibr" rid="ref1 ref2">1-2</xref>
        ].
4. Лекционная часть курса
Теоретическая часть включает следующие лекции.
1.Архитектура Intel Xeon Phi.
      </p>
      <p>2.Выполнение программ на Intel Xeon Phi. Модели организации вычислений с
использованием Intel Xeon Phi.</p>
      <p>3.Векторные расширения Intel Xeon Phi.
4.Элементы оптимизации прикладных программ для Intel Xeon Phi. Intel C/C++ Compiler.
5.Элементы оптимизации прикладных программ для Intel Xeon Phi: Intel MKL, Intel VTune
Amplifier XE.</p>
      <p>Фактически, лекционная часть курса делится на три блока: знакомство с архитектурой Intel
Xeon Phi, изучение моделей программирования, обеспечение эффективного использования
вычислительной мощи архитектуры (если задача это допускает).</p>
      <p>В лекции 1 рассматриваются основные архитектурные блоки и особенности сопроцессора:
ядро, блок векторной обработки данных, встроенная высокопроизводительная двунаправленная
кольцевая шина, полностью когерентные кэши L2 и принципы взаимодействия компонент.
Описывается принцип работы конвейера ядра, рассматривается иерархия памяти. Основное
внимание уделяется элементам, наиболее существенно влияющим на производительность
вычислений, и пониманию архитектурной основы способов оптимизации программ для
архитектуры Intel Xeon Phi.</p>
      <p>Лекция 2 содержит описание принципов выполнения программ и моделей организации
вычислений с использованием сопроцессора Intel Xeon Phi (offload model, coprocessor-only model,
symmetric model). Обсуждаются способы создания приложений для Xeon Phi. Описываются
архитектура и состав ПО, обеспечивающего выполнение программ на Intel Xeon Phi. Дается
краткое описание Intel Manycore Platform Software Stack и симметричного коммуникационного
интерфейса.</p>
      <p>В начале лекции 3 дается вводная информация о векторных расширениях. Далее
рассматриваются особенности векторных расширений Intel Xeon Phi: дается краткое описание
основных типов данных и регистрового пула, приводится обзор основных типов операций,
упоминается расширенная поддержка математических функций. Рассматривается вопрос о доступе к
векторным расширениям при программировании на языках высокого уровня. Описываются
несколько способов векторизации расчетов и их особенности. В заключительной части лекции
затрагивается важный вопрос о связи векторизации с вычислением математических функций.</p>
      <p>Лекция 4 посвящена изучению некоторых приемов оптимизации кода для Intel Xeon Phi. В
первой части лекции обсуждаются новые элементы языков программирования,
предназначенные для работы с памятью при использовании режима offload. Рассматриваются явная и
неявная схемы работы с памятью, дается их сравнительная характеристика. Во второй части
приводится дополнительная информация о способах векторизации кода, не рассмотренная подробно
в предыдущей лекции. Вновь обсуждается автоматическая векторизация кода, использование
директив для векторизации, новые возможности Array notation и Elemental functions, а также
другие возможности компилятора. В третьей части рассматривается встроенный в компилятор
профилировщик циклов, обсуждается использование отчетов компилятора, балансировка
нагрузки в параллельных программах, даются некоторые дополнительные рекомендации.
Изложение сопровождается примерами программ.</p>
      <p>В лекции 5 изучаются два важных и активно применяемых инструмента из пакета Intel
Parallel Studio XE – профилировщик Intel VTune Amplifier XE (далее Amplifier) и библиотека
ма-тематических алгоритмов Intel Math Kernel Library (MKL) – и возможности и правила их
использования при программировании для Intel Xeon Phi. Вначале изучаются особенности
использования библиотеки MKL при программировании на сопроцессоре: возможности отправки
части вычислений на сопроцессор в режимах Automatic offload, Compiler assisted offload,
выполнение расчетов на Xeon Phi и рекомендации по выбору модели программирования. Затем
рассматривается оптимизация приложений с помощью Amplifier: приводится обзор
инструмента, рассказывается об анализе эффективности приложений на сопроцессоре, обсуждаются
некоторые важные метрики для оценки производительности.
5. Лабораторный практикум</p>
      <p>Комплект лабораторных работ обеспечивает получение базовых навыков работы с
системами, использующими Intel Xeon Phi, включает рассмотрение стандартных задач
математического программирования, а также знакомство с ситуациями, возникающими при решение
реальных научно-исследовательских задач в области вычислительной физики и финансовой
математики.
1.Компиляция и запуск приложений на Intel Xeon Phi.</p>
      <p>2.Оптимизация прикладных программ для Intel Xeon Phi с использованием Intel C/C++
Compiler. Векторизация.</p>
      <p>3.Оптимизация вычислений в задаче о разложении чисел на простые сомножители.
Векторизация и балансировка нагрузки.</p>
      <p>4.Оптимизация вычислений в задаче о вычислении справедливой цены опциона
Европейского типа. Оптимизация: шаг за шагом.</p>
      <p>5.Оптимизация вычислений в задаче матричного умножения. Оптимизация работы с
памятью.</p>
      <p>В лабораторной работе 1 (ЛР1) изучаются основные модели программирования и режимы
компиляции и запуска программ, а также рассматривается ряд примеров, демонстрирующих
процесс переноса кода на сопроцессор Intel Xeon Phi. Демонстрируются подходы к написанию
кода в каждом из режимов и последовательность шагов, которые необходимо выполнить для
компиляции и запуска программ. В рамках данной лабораторной работы рассматриваются
режимы offload, coprocessor only и symmetric mode.</p>
      <p>ЛР2 формирует навыки векторизации кода в программах на языке C с использованием
IntelC/C++ Compiler. Иллюстрируются основные способы использования векторных
инструкций на сопроцессоре IntelXeonPhi: использование ключевого слова restrict и #pragma ivdep для
гарантии отсутствия потенциальных зависимостей, явная векторизация через #pragma simd,
использование Array notation и Elemental functions, рассматриваются вопросы векторизации
циклов с вызовами математических функций. В завершение рассматриваются более сложные
примеры. Акцент в ЛР2 сделан на обзорном рассмотрении различных средств на простых
примерах и представлении многообразия доступных в настоящее время средств векторизации и
общей идеологии их использования.</p>
      <p>В ЛР3 иллюстрируются некоторые решения, позволяющие добиться результата там, где
этого, казалось бы, сделать не удастся. Рассмотрен один из самых простых алгоритмов решения
задачи разложения натуральных чисел на простые множители (выбор алгоритма обусловлен не
его эффективностью, а удобством для демонстрации приемов оптимизации.) Описывается
последовательная реализация алгоритма, выполняется перенос вычислений на сопроцессор.
Предлагается простейшая параллельная реализация алгоритма, выполняется анализ ее
эффективности, обсуждаются возможные способы балансировки нагрузки для повышения
производительности. Демонстрируется один из методов векторизации сложных циклов. Показывается
способ построения гибридной схемы вычислений, позволяющей задействовать в расчетах CPU
и Xeon Phi.</p>
      <p>В ЛР4 иллюстрируются некоторые приемы оптимизации вычислений в научных и
инженерных приложениях, рассматривается достаточно простая задача финансовой математики –
вычисление справедливой цены опциона Европейского типа в том случае, когда эта цена может
быть вычислена аналитически. Дается краткое описание модели финансового рынка,
формулируются основные понятия, приводится их интуитивное описание, способствующее пониманию
сути и смысла решаемой прикладной задачи. Далее описывается базовая программная
реализация, проводится анализ производительности, шаг за шагом в программу вносятся изменения,
иллюстрирующие приемы оптимизации: устранение ненужных преобразований типов, вынос
инвариантов, эквивалентные преобразования с заменой «тяжелых» математических функций
более «легкими», векторизация вычислений, распараллеливание, «прогрев» – снижение
накладных расходов на создание потоков, понижение точности вычислений с плавающей запятой,
оптимизация работы с памятью (использование streaming stores). Эффекты от оптимизации
демонстрируются как на Intel Xeon, так и на Intel Xeon Phi.</p>
      <p>ЛР5 посвящена изучению базовых принципов применения известных способов повышения
производительности на примере известной, широко распространенной в приложениях и
хорошо исследованной в литературе задачи – умножения плотных матриц. В отличие от
предыдущих лабораторных работ, подробно изучающих разные техники оптимизации расчетов,
основное внимание уделяется вопросам оптимизации работы с памятью. Для сравнения результатов
вычислений и времени работы реализуется умножение плотных матриц с использованием
высокопроизводительной библиотеки Intel MKL. Приводится наивная реализация алгоритма
умножения матриц. Рассматриваются вопросы влияния порядка циклов на время вычислений на
сопроцессор Intel Xeon Phi. Изучается влияние выравнивания и подсказок компилятору на
векторизацию вычислений. Реализуется несколько редакций блочного алгоритма умножения
матриц. Формулируются задания для самостоятельной проработки.</p>
      <p>
        При выполнении лабораторных работ и проведении мастер-классов мы используем
компьютер "Лобачевский" Нижегородского государственного университета, который включает
несколько узлов, оснащенных сопроцессорами Intel Xeon Phi [
        <xref ref-type="bibr" rid="ref36">37</xref>
        ].
6. Методика оценки знаний обучаемых
Оценка знаний студентов производится на основании следующих данных.
– Оценки выполнения домашних заданий.
– Результат прохождения теста по материалам курса.
      </p>
      <p>В ходе разработки курса было подготовлено более 200 вопросов, из которых составлены
тесты по курсу. Тесты представлены на сайте Интуит в составе курса (www.intuit.ru) и на сайте
программы сертификации ННГУ - Intel (nncc.unn.ru).</p>
      <p>– Результат выполнения выпускной работы.</p>
      <p>В выпускной работе оценивается достигнутый уровень производительности и тип и
качество проведенных оптимизаций.
7. Опыт прочтения курса на факультете ВМК ННГУ</p>
      <p>Занятия по курсу «Программирование на Intel Xeon Phi» на третьем курсе факультета
ВМК ННГУ проводились по следующей схеме. В начале читалось несколько обзорных лекций,
включая «Введение в параллельное программирование на современных архитектурах»,
«Микроархитектура Intel Xeon Phi» и «Модели исполнения программ на сопроцессоре». Затем
каждая лекция чередовалась с практическим занятием, на котором студентам предлагалось
самостоятельно выполнить 2-3 небольших задания по материалу, рассказанному на предыдущей
лекции. Примерами таких пар «лекция-практика» могут служить занятия по темам
«Программирование в режиме Offload», «Векторизация», «Подходы к оптимизации программ на
сопроцессоре» и др. Практические занятия проводились на базе вычислительного кластера ННГУ
"Лобачевский" с Intel Xeon Phi на узлах. Каждый студент имел доступ к кластеру со своей
локальной машины по протоколу SSH.</p>
      <p>Что касается степени усваивания материалы студентами, то по нашим наблюдениям лучше
всего усваиваются те части программы, акцент на которые делается в практической части
курса. В то же время материал лекций, не вполне подкрепленных практикой, усваивается хуже.
Это справедливо, например, к теме «Микроархитектура Intel Xeon Phi». По окончании курса у
большинства студентов остается только базовое пониманием архитектуры сопроцессора, в то
время как низкоуровневые детали остаются без внимания.</p>
      <p>Отметим также, что данный курс опирается на уже изученные студентами технологии
параллельного программирования, такие как OpenMP и MPI, повторное описание которых не
входило в материал. Однако проблем с их применением на практике в рамках новой
инфраструктуры замечено не было.</p>
      <p>Основной технической сложностью при проведении занятий является необходимость
взаимодействия студентов с кластером для доступа непосредственно к Intel Xeon Phi. Причем
проблем здесь две.</p>
      <p>Первая состоит в том, что в стандартную учебную программу не входит обучение
студентов работе с системами управления кластером, а значит, это приходится делать в рамках
данного курса. Причем в силу ограниченности времени студентам дается не общее описание систем
управления, а скорее набор правил, команд, которые нужно выполнить для запуска задачи на
сопроцессоре. Это приводит к тому, что любое отклонение от стандартных команд
оборачивается проблемами с запуском, которые приходится решать индивидуально с каждым студентом
во время практических занятий.</p>
      <p>Вторая проблема – наличие свободных ресурсов кластера. В рамках апробации курса
проблему свободных ресурсов мы решали путем выделения отдельного раздела, состоящего из
нескольких узлов кластера, доступ к которым могли иметь только студенты во время
практических занятий.</p>
      <p>В ходе апробации техника проведения зачета по курсу сводилась к следующему. Степень
выполнения задач, предлагаемых студентам в рамках каждого из практических занятий,
фиксировалась преподавателем. По результатам семестра студенты, которые успешно справились с
большей частью заданий, получали зачет автоматом. Следует отметить, что в рамках апробации
таких студентов было большинство. С остальными студентами проводились устные беседы на
знание основ программирования на Intel Xeon Phi.</p>
      <p>По окончании данного курса студенты получили как теоретические знания об устройстве
сопроцессора, методах его программирования и основных подходах к оптимизации программ
для Intel Xeon Phi, так и практические навыки программирования сопроцессора в различных
режимах.
8. Заключение</p>
      <p>Мы представили учебный курс "Программирование и оптимизация для архитектуры Intel
Xeon Phi", разработанный в Нижегородском государственном университете
им.Н.И. Лобачевского. Основной целью курса является изучение базовых принципов
написания высокопроизводительных приложений для архитектуры Intel Xeon Phi. Мы представили
программу курса и методику преподавания, которые, по нашему мнению, позволяют
подготовить специалистов, способных принимать участие в научных исследованиях в области
вычислительной физики и финансовой математики. По результатам проделанной работы планируется
издать учебное пособие.
Литература
5. Свод знаний и умений предметной области «Суперкомпьютеры и параллельные
вычисления»
URL: http://hpc-education.ru/files/Svod_v24_intro_2013_09_20.pdf (дата обращения:
14.06.2015).
Programming and optimization for Intel Xeon Phi course
Alexey Linev, Iosif Meyerov, Alexander Sysoyev, Sergey Bastrakov, Anton Gorshkov and
Alexey Svistunov
Keywords: Intel Xeon Phi, Many Integrated Core Architecture, computer architecture
courses, high performance computing, parallel programming, software optimization
In this work we discuss the problem of teaching programming for Intel Xeon Phi architecture.
We present practice-oriented approach accompanied with extensive practical part. Our
method has a distinctive feature of combined usage of classical teaching examples in the area
parallel programming and real problems form areas of computational physics and financial
mathematics. This work contains description of developed "Programming and Optimization
for Intel Xeon Phi" course and it's approbation results. Russian language version of this
course is freely available at www.intuit.ru.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <article-title>Введение в принципы функционирования и применения современных мультиядерных ар- хитектур (на примере Intel Xeon Phi</article-title>
          ) URL: ttp://www.intuit.ru/studies/courses/10611/1095/info (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <article-title>Программирование на современных мультиядерных архитектурах (на примере Intel Xeon Phi</article-title>
          ) URL: http://www.intuit.ru/studies/courses/10612/1096/info (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3. Computer Science Curricula 2013 URL: https://www.acm.org/education/CS2013-final
          <source>-report.pdf (дата обращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4. NSF/
          <article-title>IEEE-TCPP Curriculum Initiative on Parallel and Distributed Computing - Core Topics for Undergraduates URL</article-title>
          : http://www.cs.gsu.edu/~tcpp/curriculum/sites/default/files/NSF-TCPP-curriculumversion1.
          <source>pdf (дата обращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          6. Cheng J.,
          <string-name>
            <surname>Grossman</surname>
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>McKercher T. Professional CUDA C Programming. N</surname>
          </string-name>
          .-Y.:
          <string-name>
            <surname>Wrox</surname>
          </string-name>
          .
          <year>2014</year>
          .
          <article-title>- 528p.</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          7.
          <string-name>
            <given-names>Cook</given-names>
            <surname>Sh</surname>
          </string-name>
          .
          <article-title>CUDA Programming: A Developer's Guide to Parallel Computing with GPUs</article-title>
          . Morgan Kaufmann,
          <year>2012</year>
          . - 600 p.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          8.
          <string-name>
            <surname>Farber R. CUDA</surname>
          </string-name>
          <article-title>Application Design and Development</article-title>
          . Morgan Kaufmann,
          <year>2011</year>
          . - 336 p.
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          9.
          <string-name>
            <surname>Fernando</surname>
            <given-names>R</given-names>
          </string-name>
          . (ed.). GPU Gems:
          <article-title>Programming techniques, tips and tricks for real-time graphics</article-title>
          .
          <source>Addison-Wesley</source>
          ,
          <year>2004</year>
          . - 784 p.
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          10.
          <string-name>
            <surname>Hwu</surname>
            <given-names>W.W. GPU</given-names>
          </string-name>
          <article-title>Computing Gems Jade Edition</article-title>
          . Applications of GPU Computing Series. - Morgan Kaufmann,
          <year>2011</year>
          . - 560 p.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          11.
          <string-name>
            <surname>Hwu</surname>
            <given-names>W.W. GPU</given-names>
          </string-name>
          <article-title>Computing Gems: Emerald Edition</article-title>
          . Morgan Kaufmann,
          <year>2011</year>
          . - 886 p.
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          12.
          <string-name>
            <surname>Sanders</surname>
            <given-names>Jason</given-names>
          </string-name>
          , Kandrot Edward.
          <article-title>CUDA by Example: An Introduction to General-Purpose GPU Programming</article-title>
          .
          <string-name>
            <surname>Addison-Wesley Professional</surname>
          </string-name>
          ,
          <year>2010</year>
          . - 312 p.
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          13.
          <string-name>
            <surname>Боресков</surname>
            <given-names>А</given-names>
          </string-name>
          .В. и др.
          <source>Параллельные вычисления на GPU</source>
          .
          <article-title>Архитектура и программная модель CUDА: Учеб</article-title>
          . пособие / А. В.
          <article-title>Боресков и др</article-title>
          .
          <source>Предисл.: В</source>
          . А.
          <string-name>
            <surname>Садовничий</surname>
          </string-name>
          . - М.: Издательство Московского университета,
          <year>2012</year>
          . -
          <fpage>336</fpage>
          с.
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          14. 6.888 Parallel and Heterogeneous Computer Architecture URL: ttp://courses.csail.mit.edu/6.888/spring13/syllabus.shtml (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          15.
          <string-name>
            <surname>MCS</surname>
          </string-name>
          572: Introduction to Supercomputing URL: http://homepages.math.uic.edu/~jan/mcs572/ (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          16. CIS*3090 Parallel
          <string-name>
            <surname>Programming</surname>
            <given-names>URL</given-names>
          </string-name>
          : http://www.uoguelph.ca/~gardnerw/courses/cis3090/ (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          17.
          <string-name>
            <surname>Advanced Computational Physics - Parallel Computing</surname>
            <given-names>URL</given-names>
          </string-name>
          : http://einstein.drexel.edu/courses/PHYS405/Content.html (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          18.
          <string-name>
            <surname>Crash</surname>
          </string-name>
          <article-title>Course on Programming and Optimization with Intel Xeon Phi Coprocessors at</article-title>
          SC14 URL: http://research.colfaxinternational.com/post/2014/11/16/SC14.aspx (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          19.
          <article-title>Parallel Programming and Optimization for Intel® Xeon Phi™ Coprocessors URL: http://www.acceleware.com/xeon-phi-training (дата обращения</article-title>
          :
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          20.
          <article-title>Учебные курсы по возможностям сопроцессора Intel Xeon Phi | Intel Developer Zone URL</article-title>
          : https://software.intel.com/ru-ru/mic-developer/training (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref20">
        <mixed-citation>
          21.
          <string-name>
            <surname>Master</surname>
          </string-name>
          <article-title>Class: Programming on Supercomputers</article-title>
          . URL: https://www.itmasters.edu.au/free-short
          <article-title>-course-programming-super-computers/ (дата об-</article-title>
          <source>ращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref21">
        <mixed-citation>
          22.
          <article-title>Parallel Programming and Optimization With Intel Xeon Phi Coprocessor</article-title>
          . URL: https://www.msi.umn.edu/content/parallel
          <article-title>-programming-and-optimization-intel-xeon-phicoprocessor (дата обращения</article-title>
          :
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref22">
        <mixed-citation>
          23.
          <article-title>Introduction to Programming the Xeon Phi Processor URL: https://www.pdc.kth.se/events/event-repository/introduction-to-programming-the-xeon-phiprocessor-november-2015 (дата</article-title>
          обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref23">
        <mixed-citation>
          24.
          <article-title>Programming the Xeon Phi (XSEDE) URL</article-title>
          : https://portal.tacc.utexas.edu/
          <article-title>-/programming-the-xeon-phi-xsede-</article-title>
          (
          <source>дата обращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref24">
        <mixed-citation>
          25.
          <string-name>
            <surname>Курс</surname>
          </string-name>
          <article-title>"Дополнительные главы по гетерогенным параллельным вычислениям" URL: http://msu-intel.rubea</article-title>
          .net/node/103 (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref25">
        <mixed-citation>
          26.
          <article-title>Дисциплина по выбору "Программирование Intel Xeon Phi"</article-title>
          URL: http://ssd.sscc.ru/ru/chair/nsu/phi (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref26">
        <mixed-citation>
          27. Intel Developer Zone URL: http://software.intel.com/en-us/mic-developer
          <source>(дата обращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref27">
        <mixed-citation>
          28.
          <string-name>
            <surname>Intel Xeon Phi Coprocessor System Software Developers Guide</surname>
            <given-names>URL</given-names>
          </string-name>
          : http://software.intel.com/en-us/articles/intel-xeon
          <article-title>-phi-coprocessor-system-softwaredevelopers-guide (дата обращения</article-title>
          :
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref28">
        <mixed-citation>
          29.
          <string-name>
            <surname>Nguyen Loc</surname>
            <given-names>Q</given-names>
          </string-name>
          et al.
          <article-title>Intel Xeon Phi Coprocessor Developer's Quick Start Guide</article-title>
          . URL: http://software.intel.com/en-us/articles/intel-xeon
          <article-title>-phi-coprocessor-developers-quick-start-guide (дата обращения</article-title>
          :
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref29">
        <mixed-citation>
          30.
          <string-name>
            <surname>Rahman R. Intel Xeon Phi Core Micro-architecture</surname>
            <given-names>URL</given-names>
          </string-name>
          : http://software.intel.com/enus/articles/intel-xeon
          <article-title>-phi-core-micro-architecture (дата</article-title>
          <source>обращения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref30">
        <mixed-citation>
          31.
          <string-name>
            <surname>Krishnai R. Data</surname>
          </string-name>
          <article-title>Alignment to Assist Vectorization URL: http://software.intel.com/en-us/articles/data-alignment-to-assist-vectorization (дата обра-</article-title>
          <source>щения: 14.06</source>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref31">
        <mixed-citation>
          32.
          <string-name>
            <surname>Mackay</surname>
            <given-names>D.</given-names>
          </string-name>
          <string-name>
            <surname>Optimization</surname>
          </string-name>
          and
          <article-title>Performance Tuning for Intel Xeon Phi Coprocessors</article-title>
          , Part 1:
          <string-name>
            <given-names>Optimization</given-names>
            <surname>Essentials</surname>
          </string-name>
          ,
          <year>2012</year>
          . URL: http://software.intel.com/en-us/articles/optimization-and
          <article-title>-performance-tuning-for-intel-xeonphi-coprocessors-part-1-optimization</article-title>
          (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref32">
        <mixed-citation>
          33.
          <string-name>
            <surname>Reinders</surname>
            <given-names>J.</given-names>
          </string-name>
          <article-title>An Overview of Programming for Intel Xeon processors and Intel Xeon Phi coprocessors</article-title>
          . URL: http://software.intel.com/en-us/blogs/2012/11/14/
          <article-title>an-overview-of-programming-for-intelxeon-processors-and-intel-xeon-phi (дата обращения</article-title>
          :
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref33">
        <mixed-citation>
          34.
          <string-name>
            <surname>Jeffers</surname>
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Reinders</surname>
            <given-names>J</given-names>
          </string-name>
          .
          <article-title>Intel Xeon Phi Coprocessor High-Performance Programming</article-title>
          . Morgan Kaufmann Publishing and Elsevier,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref34">
        <mixed-citation>
          35.
          <string-name>
            <surname>Jeffers</surname>
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Reinders</surname>
            <given-names>J.</given-names>
          </string-name>
          <article-title>High Performance Parallelism Pearls: Multicore and Many-core Programming Approaches</article-title>
          . Morgan Kaufmann,
          <year>2014</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref35">
        <mixed-citation>
          36.
          <string-name>
            <surname>Vladimirov</surname>
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Asai</surname>
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karpusenko</surname>
            <given-names>V</given-names>
          </string-name>
          .
          <article-title>Parallel Programming and Optimization with Intel Xeon Phi Coprocessors</article-title>
          . Colfax International,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref36">
        <mixed-citation>
          37.
          <string-name>
            <surname>Приволжский</surname>
          </string-name>
          научно
          <article-title>-образовательный центр суперкомпьютерных технологий - Ресурсы URL: http://hpc-education.unn</article-title>
          .ru/ru/Ресурсы (дата обращения:
          <volume>14</volume>
          .
          <fpage>06</fpage>
          .
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>