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

StackOverflow https://stackoverflow.com/questions/615264

Вопрос

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

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

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

Спасибо,

Адриан

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top