import sys
sys.stdout = open('stdout.txt', 'w')
Я не использовал TBB экстенсивно, но мое впечатление - то, что они дополняют друг друга больше, чем конкуренция. TBB обеспечивает ориентированные на многопотоковое исполнение контейнеры и некоторые параллельные алгоритмы, тогда как OpenMP является большим количеством способа параллелизировать существующий код.
Лично я нашел OpenMP очень легким заскочить в существующий код, где у Вас есть parallelisable цикл или набор разделов, которые могут быть выполнены параллельно. Однако не помогает Вам особенно для случая, где необходимо изменить некоторые совместно используемые данные - где параллельные контейнеры TBB могли бы быть точно, что Вы хотите.
, Если все Вы хотите, должен параллелизировать циклы, где повторения независимы (или может быть довольно легко сделан так), я пошел бы для OpenMP. Если Вы испытываете необходимость в большем взаимодействии между потоками, я думаю, что TBB может предложить немного больше в том отношении.
В целом я нашел, что использование, TBB требует намного большего количества трудоемких изменений в кодовой базе с высокой выплатой, в то время как OpenMP дает быструю, но умеренную выплату. Если Вы смотрите новый модуль с нуля и думаете долгосрочное движение с TBB. Если Вы хотите маленькие но непосредственные усиления, идут с OpenMP.
кроме того, TBB и OpenMP не являются взаимоисключающими.
Из блога программного обеспечения Intel: Сравнивают Windows* потоки, OpenMP*, IntelВ® Threading Building Blocks для параллельного программирования
, Это - также вопрос стиля - для меня, TBB является очень C++ как, в то время как мне не нравятся прагмы OpenMP так очень (сильные запахи C немного, использовал бы его, если бы я должен был записать в C).
я также рассмотрел бы имеющиеся знания и опыт команды. Изучение новой библиотеки (особенно когда дело доходит до поточной обработки/параллелизма) действительно занимает время. Я думаю, что на данный момент, OpenMP более широко известен и развертывается, чем TBB (но это - просто мнение о шахте).
еще один фактор - но рассмотрение наиболее распространенных платформ, вероятно, не проблема - мобильность. Но лицензия могла бы быть проблемой.
Я фактически использовал оба, и у меня общее впечатление, что если ваш алгоритм довольно легко сделать параллельным (например, циклы одинакового размера, не слишком большая взаимозависимость данных), OpenMP проще, и довольно приятно работать. На самом деле, если вы обнаружите, что можете использовать OpenMP, возможно, это лучший путь, если вы знаете, что ваша платформа будет поддерживать его. Я не использовал новые структуры задач OpenMP, которые являются гораздо более общими, чем исходные циклы и опции секций.
TBB предоставляет вам больше структур данных заранее, но определенно требует большего заранее. Кроме того, он может лучше информировать вас об ошибках в состоянии гонки. Под этим я подразумеваю, что в OpenMP довольно просто включить условия гонки, не делая что-то общее (или что-то еще), что должно быть. Вы видите это только тогда, когда получаете плохие результаты. Я думаю, что это менее вероятно с TBB.
В целом, мои личные предпочтения были связаны с OpenMP, особенно с учетом его повышенной выразительности в задачах.
В 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%.