Предположим, у меня на хосте запущено одно приложение c / c ++. на центральном процессоре работает несколько потоков, а на ядрах Xeon Phi — 50 потоков.
Как я могу убедиться, что каждый из этих 50 работает на своем собственном ядре Xeon Phi и никогда не удаляется из кеша ядра (учитывая, что код достаточно мал).
Может кто-нибудь, пожалуйста, обрисовать в общих чертах общую идею, как это сделать и какой инструмент / API будет более подходящим (для кода C / C ++)?
Какой самый быстрый способ обмена данными между хост-потоком-агрегатором и потоками 50 Phi?
Учитывая, что фактический параллелизм будет очень ограничен — это приложение будет больше похоже на приложение с плоскостью 51 потока с некоторой базовой многопоточной синхронизацией данных.
Могу ли я использовать обычный компилятор C / C ++ для создания такого приложения?
Вы подняли несколько вопросов:
Да, вы можете использовать обычную программу на C и скомпилировать ее, используя обычные компиляторы Intel C / C ++ / Fortran (известный как Intel Composer XE), чтобы генерировать двоичные файлы, работающие на сопроцессоре Intel Xeon Phi в «родном» / «симметричном» или «разгрузочном» режимах. В простейшем случае — вы просто перекомпилируете свою программу на C / C ++ с -mmic и запускаете ее «изначально» на Phi «как есть».
Какой API использовать? использование OpenMP4.0 стандартный или Intel Cilk Plus модели программирования (на самом деле набор прагм или ключевых слов, применимых к C / C ++). OpenCL, Intel TBB и, вероятно, OpenACC также возможны, но OpenMP и Cilk Plus имеют возможность выражать многопоточность, векторизацию и разгрузку (т. Е. 3 вещи, необходимые для программирования на Xeon Phi) без ре-факторинга или переписывания «обычной C / C ++ / Fortran» программы. ,
Закрепление темы: может быть достигнуто через OpenMP сродство (см. более подробную информацию о MIC_KMP_AFFINITY ниже) или о сходстве Intel TBB.
Самый быстрый способ обмена данными между хостом и целевым Phi — это .. избегать любого обмена, используя, например, симметричный подход MPI. Тем не менее, вы, кажется, спрашиваете о «разгрузке» модели программирования, поэтому асинхронная разгрузка Вы можете достичь наилучшей производительности. В то же время синхронный offload теоретически проще с точки зрения программирования, но хуже с точки зрения достижимой производительности.
В целом, вы склонны задавать несколько общих вопросов, поэтому я бы порекомендовал начать с самого начала, т. Е. Посмотреть на следующие ~ 10 страниц доктора Доббса. руководство или учитывая Intel вводный документ.
Закрепление тем — это более сложная тема, и в то же время она кажется «наиболее интересной» для вас, поэтому я объясню подробнее:
Других решений пока нет …