WedX - журнал о программировании и компьютерных науках

Как разгрузить определенный поток одного приложения на определенные ядра Xeon Phi?

Предположим, у меня есть одно приложение c/c++, работающее на хосте. на центральном процессоре выполняется несколько потоков, а на ядрах Xeon Phi — 50 потоков.

Как я могу убедиться, что каждый из этих 50 работает на своем собственном ядре Xeon Phi и никогда не очищается из кэша ядра (учитывая, что код достаточно мал).

Может ли кто-нибудь изложить очень общую идею, как это сделать и какой инструмент/API будет более подходящим (для кода C/C++)?

Каков самый быстрый способ обмена данными между хост-агрегатором потоков и 50 потоками Phi?

Учитывая, что фактический параллелизм будет очень ограниченным, это приложение будет больше похоже на 51-поточное приложение с некоторой базовой многопоточной синхронизацией данных.

Можно ли использовать обычный компилятор C/C++ для создания подобного приложения?


  • Сначала предупреждение: это, вероятно, плохая идея. Если вы все равно настаиваете на этом, это будет зависеть от используемого вами API. IIRC, Phi обычно программируется через OpenCL. OpenCL позволяет разделить устройство с помощью clCreateSubDevices. Чтобы ограничить поток одним ядром, вы должны выполнить задачу на вспомогательном устройстве только с одним вычислительным устройством. 13.04.2014
  • Извини, Джерри, но я не согласен. «обычно» означает тот, кто мигрировал с Nvidia card dev. В мире есть и другие люди. 13.04.2014
  • Хорошо, позвольте мне попытаться быть немного более общим: доступный метод будет зависеть от API, который вы используете для его программирования, и вы, похоже, твердо намерены лишить нас этой информации, так что все, что мы можем сделать, это догадываться. 13.04.2014
  • нет, я не. Я отредактировал вопрос, чтобы подчеркнуть, что я очень открыт для того, что использовать (я назвал «инструменты», что я, вероятно, хотел, было «API»).. я хочу самый короткий путь - у меня нет опыта работы с OpenCL, и я не хочу, чтобы мое приложение быть переносимым на другие платформы. поэтому мне нужен самый короткий и немедленный способ реализовать то, что я хочу. 13.04.2014

Ответы:


1

Вы подняли несколько вопросов:

  1. Да, вы можете использовать обычную программу C и скомпилировать ее с помощью обычных компиляторов Intel C/C++/Fortran (известных как Intel Composer XE), чтобы сгенерировать двоичный файл, способный работать на сопроцессоре Intel Xeon Phi. либо в «собственном»/«симметричном», либо в «разгрузочном» режимах. В простейшем случае вы просто перекомпилируете свою программу на C/C++ с параметром -mmic и запустите ее "исходно" на Phi "как есть".

  2. Какой API использовать? Используйте модели программирования OpenMP4.0 или Intel Cilk Plus (фактически набор прагм или ключевых слов, применимых к C/C++). OpenCL, Intel TBB и, вероятно, OpenACC также возможны, но OpenMP и Cilk Plus имеют возможность выражать многопоточность, векторизацию и разгрузку (т.е. 3 вещи, необходимые для программирования Xeon Phi) без рефакторинга или переписывания «обычной программы C/C++/Fortran». .

  3. Закрепление потоков: может быть достигнуто с помощью соответствия OpenMP (подробнее о MIC_KMP_AFFINITY см. ниже) или средств сходства Intel TBB.

  4. Самый быстрый способ обмена данными между хостом и целевым Phi - это... избегать любого обмена - например, используя симметричный подход MPI. Однако вы, похоже, конкретно спрашиваете о модели программирования «разгрузка», поэтому с помощью асинхронная разгрузка позволяет добиться наилучшей производительности. При этом синхронная разгрузка теоретически проще с точки зрения программирования, но хуже с точки зрения достижимой производительности.

В целом, вы, как правило, задаете несколько общих вопросов, поэтому я бы рекомендовал начать с самого начала, т.е. просмотреть следующие ~10 страниц доктора Доббса руководство или данные Intel' вводный документ.


Закрепление тем — более сложная тема и в то же время кажется вам «наиболее интересной», поэтому я объясню подробнее:

15.04.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: [email protected]