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

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

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

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

5
задан Karl 23 May 2010 в 11:04
поделиться

4 ответа

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

Intel vs AMD, на мой взгляд, не имеет значения.

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

8
ответ дан 18 December 2019 в 07:08
поделиться

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

9
ответ дан 18 December 2019 в 07:08
поделиться

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

2
ответ дан 18 December 2019 в 07:08
поделиться

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

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

2
ответ дан 18 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: