Подтвердить что ты не робот

Библиотеки параллелизма С++: OpenMP vs. Thread Building Blocks

Я собираюсь модифицировать свой собственный графический движок, чтобы он использовал многоядерные процессоры. Точнее, я ищу библиотеку для параллелизации циклов.

Мне кажется, что и OpenMP, и Intel Thread Building Blocks очень хорошо подходят для работы. Кроме того, оба они поддерживаются компилятором Visual Studio С++ и большинством других популярных компиляторов. И обе библиотеки кажутся довольно простыми в использовании.

Итак, какой я должен выбрать? Кто-нибудь пробовал обе библиотеки и может дать мне некоторые минусы и плюсы использования любой библиотеки? Кроме того, с чем вы решили работать в конце?

Спасибо,

Адриан

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

  • TBB включает некоторые интересные исследования, полученные из академических исследований, например рекурсивный параллельный подход данных.
  • Существует некоторая работа по обеспечению удобства кеширования, для пример.
  • Лекция в блоге Intel кажется действительно интересной.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 6

Да, TBB намного более дружелюбен к С++, в то время как OpenMP более подходит для кода стиля FORTRAN, учитывая его дизайн. Новая функция задач в OpenMP выглядит очень интересно, и в то же время объект Lambda и функции в С++ 0x может облегчить использование TBB.

Ответ 7

В Visual Studio 2008 вы можете добавить следующую строку для распараллеливания любого цикла 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 оба ядра на моем Core 2 Duo были использованы для максимальной емкости, поэтому общее использование ЦП составило от 50% до 100%.

Ответ 8

Насколько я знаю, TBB (есть версия OpenSource под GPLv2 avaiable) больше адресует С++, а затем C Area. В эти времена трудно найти С++ и общие ООП-распараллеливания конкретных Информаций. Большинство адресов функциональных вещей, таких как c (то же самое на CUDA или OpenCL). Если вам нужна поддержка С++ для распараллеливания, перейдите на TBB!