Библиотеки распараллеливания C++: OpenMP по сравнению с [закрытыми] стандартными блоками потока

import sys
sys.stdout = open('stdout.txt', 'w')
43
задан Adrian Grigore 11 March 2009 в 04:03
поделиться

6 ответов

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

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

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

46
ответ дан Peter 4 August 2019 в 17:57
поделиться
2
ответ дан 4 August 2019 в 17:57
поделиться

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

кроме того, TBB и OpenMP не являются взаимоисключающими.

16
ответ дан Nikhil 4 August 2019 в 17:57
поделиться

Из блога программного обеспечения Intel: Сравнивают Windows* потоки, OpenMP*, IntelВ® Threading Building Blocks для параллельного программирования

, Это - также вопрос стиля - для меня, TBB является очень C++ как, в то время как мне не нравятся прагмы OpenMP так очень (сильные запахи C немного, использовал бы его, если бы я должен был записать в C).

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

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

  • TBB включает часть хорошего исследования, происходящего из научного исследования, например рекурсивный подход параллели данных .
  • существует некоторая работа над дружелюбием кэша, для пример .
  • Лекция блога Intel кажется действительно интересной.
25
ответ дан Anonymous 4 August 2019 в 17:57
поделиться

Я фактически использовал оба, и у меня общее впечатление, что если ваш алгоритм довольно легко сделать параллельным (например, циклы одинакового размера, не слишком большая взаимозависимость данных), OpenMP проще, и довольно приятно работать. На самом деле, если вы обнаружите, что можете использовать OpenMP, возможно, это лучший путь, если вы знаете, что ваша платформа будет поддерживать его. Я не использовал новые структуры задач OpenMP, которые являются гораздо более общими, чем исходные циклы и опции секций.

TBB предоставляет вам больше структур данных заранее, но определенно требует большего заранее. Кроме того, он может лучше информировать вас об ошибках в состоянии гонки. Под этим я подразумеваю, что в OpenMP довольно просто включить условия гонки, не делая что-то общее (или что-то еще), что должно быть. Вы видите это только тогда, когда получаете плохие результаты. Я думаю, что это менее вероятно с TBB.

В целом, мои личные предпочтения были связаны с OpenMP, особенно с учетом его повышенной выразительности в задачах.

6
ответ дан 26 November 2019 в 22:43
поделиться

В Visual Studio 2008 вы можете добавить следующую строку для распараллеливания любого цикла for. Он даже работает с несколькими вложенными циклами for. Вот пример:

#pragma omp parallel for private(i,j)
for (i=0; i<num_particles; i++)
{
  p[i].fitness = fitnessFunction(p[i].present);
  if (p[i].fitness > p[i].pbestFitness)
  { 
     p[i].pbestFitness = p[i].fitness;
     for (j=0; j<p[i].numVars; j++) p[i].pbest[j] = p[i].present[j];
  }
}  
gbest = pso_get_best(num_particles, p);

После того, как мы добавили #pragma omp parallel, оба ядра на моем Core 2 Duo были использованы на полную мощность, поэтому общая загрузка ЦП увеличилась с 50% до 100%.

1
ответ дан 26 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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