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

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

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

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

Ответы [ 5 ]

9 голосов
/ 24 мая 2010

В качестве отправной точки я бы предложил 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/

8 голосов
/ 23 мая 2010

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

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

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

2 голосов
/ 23 мая 2010

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

2 голосов
/ 23 мая 2010

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

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

1 голос
/ 20 июля 2011

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

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

...