Многоядерное программирование. Повышение MPI, OpenMP, TBB или что-то еще?

Я новичок в многоядерном программировании, но я знаю, как программировать на C++.

Сейчас я ищу библиотеку многоядерного программирования. Я просто хочу попробовать, просто для удовольствия, и сейчас я нашел 3 API, но я не уверен, какой из них мне следует придерживаться. Прямо сейчас я вижу MPI, OpenMP и TBB Boost.

Для тех, кто имел опыт работы с любым из этих 3 API (или любым другим API), не могли бы вы сказать мне разницу между ними? Есть ли фактор, который следует учитывать, например, архитектура AMD или Intel?

5 ответов

Решение

Под капотом OpenMP находится многопоточное программирование, но на более высоком уровне абстракции, чем TBB и тому подобное. Выбор между ними для параллельного программирования на многоядерном компьютере примерно такой же, как выбор между любым программным обеспечением более высокого и более низкого уровня в пределах одной области: существует компромисс между выразительностью и управляемостью.

Я думаю, что Intel против AMD не имеет значения.

И ваш выбор должен зависеть от того, чего вы пытаетесь достичь; Например, если вы хотите изучать TBB, TBB определенно является подходящим способом. Но если вы хотите распараллелить существующую программу на C++ простыми шагами, то, вероятно, лучше выбрать OpenMP; TBB все еще будет рядом, чтобы вы занялись им. Я бы, вероятно, сначала избежал MPI, если бы не был уверен, что перейду от программирования с общей памятью (что в основном то, что вы делаете на многоядерном компьютере) к программированию с распределенной памятью (в кластерах или сетях). Как всегда, выбранная вами технология должна зависеть от ваших требований.

В качестве отправной точки я бы предложил OpenMP. При этом вы можете очень просто выполнить три основных типа параллелизма: циклы, разделы и задачи.

Параллельные петли

Это позволяет вам разделять итерации цикла на несколько потоков. Например:

#pragma omp parallel for
for (int i=0; i<N; i++) {...}

Если бы вы использовали два потока, то первый поток выполнял бы первую половину итерации. Второй поток будет выполнять второй тайм.

Разделы

Это позволяет вам статически разделить работу на несколько потоков. Это полезно, когда есть очевидная работа, которая может выполняться параллельно. Однако это не очень гибкий подход.

#pragma omp parallel sections
{
  #pragma omp section
  {...}
  #pragma omp section
  {...}
}

Задачи

Задачи являются наиболее гибким подходом. Они создаются динамически, и их выполнение выполняется асинхронно, либо потоком, который их создал, либо другим потоком.

#pragma omp task
{...}

преимущества

OpenMP имеет несколько вещей для этого.

  • Основанный на директивах: компилятор выполняет работу по созданию и синхронизации потоков.

  • Инкрементальный параллелизм: вы можете сосредоточиться только на той области кода, которую нужно распараллелить.

  • Одна исходная база для последовательного и параллельного кода: директивы OpenMP распознаются компилятором только при запуске его с флагом ( -fopenmp для gcc). Таким образом, вы можете использовать одну и ту же исходную базу для генерации как последовательного, так и параллельного кода. Это означает, что вы можете отключить флаг, чтобы увидеть, получаете ли вы тот же результат от серийной версии кода или нет. Таким образом, вы можете изолировать ошибки параллелизма от ошибок в алгоритме.

Вы можете найти полную спецификацию OpenMP на http://www.openmp.org/

Зависит от вашего фокуса. Если вы в основном заинтересованы в многопоточном программировании, используйте TBB. Если вас больше интересует параллелизм на уровне процесса, тогда MPI - это то, что вам нужно.

Я бы посоветовал вам поиграть с MapReduce на какое-то время. Вы можете установить несколько экземпляров виртуальных машин на одну и ту же машину, каждая из которых запускает экземпляр Hadoop (Hadoop - это реализация MapReduce с открытым исходным кодом Yahoo!). В Интернете есть множество обучающих программ по настройке Hadoop.

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

Еще одна интересная библиотека - OpenCL. Это в основном позволяет вам наилучшим образом использовать все ваше оборудование (CPU, GPU, DSP, ...).

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

Другие вопросы по тегам