Из этого https://software.intel.com/en-us/videos/purpose-of-the-mic-architecture Я понимаю, что приложения со сложным или многочисленным произвольным доступом к памяти не очень подходят для Intel Xeon-phi. Это связано с тем, что в архитектуре используются 61 ядро и 8 контроллеров памяти. В случае пропадания кэша L1 и L2 требуется до 100 с циклов, чтобы извлечь строку в память и подготовить ее к использованию ЦПУ. Такие приложения называются задержкой.
Затем в руководстве упоминается, что многоядерная архитектура (только для сопроцессора Xeon-phi) хорошо подходит для высокопараллельного однородного кода. Два вопроса оттуда:
Что называется однородным кодом?
Каковы реальные приложения, которые могут в полной мере извлечь выгоду из архитектуры MIC?
Я вижу архитектуру Intel MIC как «GPGPU на базе x86«и если вы знакомы с концепцией GPGPU вы найдете себя знакомым с Intel MIC.
однородная кластеризация это системная инфраструктура с несколькими исполнительными модулями (то есть процессорами) с одинаковыми функциями. Например, многоядерная система с четырьмя процессорами Intel Xeon является однородной.
гетерогенная кластеризация это системная инфраструктура с несколькими исполнительными модулями с различными функциями (например, CPU и GPU). Например, мой Levono z510 с Intel i7 Haswell (4 процессора), Nvidia GT740M (GPU) и Intel HD Graphics 4600 (GPU) представляет собой гетерогенную систему.
Пример гетерогенный код может быть видеоигрой.
В видеоигре есть управляющий код, исполняемый одним кодом одного процессора, который управляет действиями других агентов, посылает шейдеры для выполнения на графических процессорах, физические вычисления для других ядер или графических процессоров и так далее.
В этом примере вам нужно написать код, который запускается на процессоре (так что он «осведомлен о процессоре») и код, который выполняется на графическом процессоре (то есть, он «поддерживает GPU»). Это на самом деле делается с помощью разные инструменты, разные языки программирования и разные модели программирования!
однородный код это код, который не нужно знать N разные модели программирования, по одному для каждого вида агента. Это точно такая же модель программирования, язык и инструмент.
Посмотрите это очень просто образец кода для MPI библиотека.
Код все написано в С, это та же программа это просто взять другой поток.
Насчет приложений, ну это действительно широкий вопрос …
Как было сказано выше, я вижу Intel MIC как GPGPU на базе x86 ISA (по крайней мере, отчасти).
SDK, особенно полезный (и указанный в видео, которое вы связали) для работы с кластерными системами, OpenCL, это может быть использовано для быстрого обработка изображений и компьютерное зрение и в основном для всего, что нужно один и тот же алгоритм будет запускаться миллиарды раз с разными входами (например, приложения для криптографии / перебор).
Если вы ищете какой-то проект на основе OpenCL в Интернете, вы получите идею.
Чтобы ответить на второй вопрос, лучше спросить себя «Что не могло воспользоваться преимуществами архитектуры MIC?«и мы скоро обнаружим, что чем больше алгоритм далек от концепции Потоковая обработка и связанные темы, в том числе ядро, тем меньше он подходит для микрофона.
Во-первых, прямой ответ на ваш прямой вопрос — чтобы получить максимальную отдачу от сопроцессора, ваш код должен иметь возможность использовать большое количество потоков и векторизоваться. Сколько потоков? Что ж, у вас есть 60 ядер (+/- в зависимости от того, какую версию вы получаете) и 4 потока на ядро, при этом во многих кодах можно найти точку с 2 потоками на ядро. Иногда вы можете получить хорошую производительность, даже если вы не используете каждое ядро. Но векторизация чрезвычайно важна; длинные (512 байт) векторы являются большим источником скорости для сопроцессора.
Теперь перейдем к программированию. В сопроцессоре Intel Xeon Phi используются два разных типа программирования — разгрузка и нативное.
В модели разгрузки вы пишете программу, определяете, какие части этого кода имеют достаточный параллелизм, чтобы использовать большое количество ядер в сопроцессоре, и помечаете эти разделы директивами разгрузки. Затем внутри этих выгруженных разделов вы пишете код, используя некоторую форму параллелизма, например OpenMP. (Гетерогенный)
В нативном коде вы не используете директивы разгрузки, а вместо этого используете директиву -mmic компилятора. Затем вы запускаете код прямо на сопроцессоре. Код, который вы пишете, будет использовать некоторую форму параллелизма, такую как OpenMP, чтобы использовать большое количество ядер, которые есть у сопроцессора. (Однородная)
Другим вариантом этих моделей программирования является использование MPI, часто в дополнение к OpenMP. Вы можете использовать модель программирования разгрузки, и в этом случае узлы в вашей системе MPI будут узлами хоста в вашей системе. (Гибрид) В качестве альтернативы, вы можете использовать собственную модель программирования, в этом случае вы рассматриваете сопроцессор как просто еще один узел в вашей системе. (Гетерогенно, если хост и сопроцессоры являются узлами; однородно, если используются только сопроцессоры.)
Возможно, вы заметили, что ничего из сказанного мною не подразумевает отдельный стиль программирования для хоста и сопроцессора. Вы можете сделать некоторые оптимизации, которые позволят предотвратить выполнение кода, написанного для сопроцессора, на процессоре, но, в общем, код, который вы пишете для сопроцессора, также можно скомпилировать и запустить на хосте, просто изменив параметры компилятора. ,
Что касается реальных приложений, см. https://software.intel.com/en-us/mic-developer/app-catalogs