2009-03-05 2 views
41

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

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

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

Спасибо,

Адриан

+0

Аналогичный вопрос: http://stackoverflow.com/questions/326487/multithreaded-image-processing-in-c (Я добавил ссылку на этот вопрос в своем вопросе.) – strager

ответ

43

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

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

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

+2

Хороший вопрос о существующем коде. Легче подключить несколько прагмы здесь и там. Включение TBB может быть более сложным (многое зависит от существующего стиля кода) – Anonymous

25

Из блога программного обеспечения компании Intel: Compare Windows* threads, OpenMP*, Intel® Threading Building Blocks for parallel programming

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

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

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

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

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

+2

Да, забыл смайлик где-то в первой строке;) – Anonymous

15

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

Также TBB и OpenMP не являются взаимоисключающими.

5

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

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

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

1

В Visual Studio 2008 вы можете добавить следующую строку, чтобы распараллелить любой цикл «за». Он работает даже с несколькими вложенными циклами. Ниже приведен пример:

#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%.

+1

Просто примечание: вложенные циклы работают только в том случае, если компилятор поддерживает его – Nav

+2

Еще одно примечание: вы можете использовать 'omp parallel for' для распараллеливания любых ** параллелизуемых * * для петли. Например, вы не можете использовать 'omp parallel for', если тело содержит некоторый код, подобный этому:' p [j] = p [j] - p [j-1] ' – chus

1

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

+0

TBB теперь использует лицензию Apache ... – Jeff

2

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

Смежные вопросы