Параллельная агрегация коллекции с использованием 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() внутри параллельного цикла добавляет стоимость поиска в хеш-таблице к каждой итерации цикла. В общем, используйте параллельное агрегирование для увеличения производительности, когда итерации выполняют сложные вычисления.
Благодарю.