Параллельная агрегация коллекции с использованием PPL или TBB

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

vector<vector<double>> sum;

for (const auto* fold : _obj.GetFolds())
     sum.push_back(move(vector<double>(fold->GetSize())));

for (int index : sequence)
{
     vector<vector<double>> values = Calculate(vec1[index], vec2[index]);

     for (int i = 0; i < sum.size(); i++)
     {
          for (int j = 0; j < sum[i].size(); j++)
               sum[i][j] += values[i][j];
     }
}

Я посмотрел на страницу MSDN http://msdn.microsoft.com/en-us/library/gg663540.aspx которой описывается параллель_ для комбинируемого, и http://msdn.microsoft.com/en-us/library/dd470426.aspx, показывающий parallel_transform с parallel_reduce, но это простые примеры только со счетчиком.

vector<int> sequence = ...

  combinable<int> count([]() { return 0; });     

  parallel_for_each(sequence.cbegin(), sequence.cend(), 
    [&count](int i)
    {
        count.local() += IsPrime(i) ? 1 : 0;
    });
  return count.combine(plus<int>());

У меня возникают трудности с поиском примеров, когда я собираю параллельный цикл vector<vector<double>> sum как указано выше.

Кроме того, я ищу совет о том, использовать ли61_train_inform и Combinable или Parallel_transform с Parallel_reduce? Первая ссылка выше гласит:

Функция parallel_reduce обычно является рекомендуемым подходом, когда вам необходимо применить шаблон параллельного агрегирования в приложениях, использующих PPL. Его декларативный характер делает его менее подверженным ошибкам, чем другие подходы, и его производительность на многоядерных компьютерах конкурирует с ними. Внедрение параллельной агрегации с помощью parallel_reduce не требует добавления блокировок в ваш код. Вместо этого вся синхронизация происходит внутри. Конечно, если parallel_reduce не удовлетворяет вашим потребностям или вы предпочитаете менее декларативный стиль кодирования, вы также можете использовать комбинируемый класс с parallel_for или parallel_for_each для реализации параллельной агрегации.

Вы должны знать, что parallel_for и parallel_for_each увеличивают издержки благодаря поддержке таких функций, как отмена и кража динамического диапазона. Кроме того, вызов метода combinable::local() внутри параллельного цикла добавляет стоимость поиска в хеш-таблице к каждой итерации цикла. В общем, используйте параллельное агрегирование для увеличения производительности, когда итерации выполняют сложные вычисления.

Благодарю.

0 ответов

Другие вопросы по тегам