Я решил написать алгоритм для использования параллельной агрегации. Вот однопоточный код, который я хочу преобразовать.
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#map_reduce_example показывающий параллелизм с параллелизмом, но это простые примеры только со счетчиком.
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
как указано выше.
Кроме того, я ищу совет о том, использовать ли parallel_for и combinable или parallel_transform с parallel_reduce? Первая ссылка выше гласит:
Функция parallel_reduce обычно является рекомендуемым подходом
всякий раз, когда вам нужно применить шаблон параллельной агрегации в
приложения, использующие PPL. Его декларативный характер делает его менее склонным
к ошибке, чем другие подходы, и его производительность на многоядерных
компьютеры конкурируют с ними. Реализация параллельной агрегации
с parallel_reduce не требует добавления блокировок в ваш код.
Вместо этого вся синхронизация происходит внутри. Конечно, если
parallel_reduce не соответствует вашим потребностям или, если вы предпочитаете менее
декларативный стиль кодирования, вы также можете использовать комбинируемый класс
с parallel_for или parallel_for_each, чтобы реализовать параллель
агрегация.Вы должны знать, что добавлены параллельные_параметры и параллельные_для
накладные расходы из-за их поддержки таких функций, как отмена и
кража динамического диапазона. Кроме того, вызов метода combinable :: local ()
внутри параллельного цикла добавляет стоимость поиска хеш-таблицы для каждого
итерация цикла. В общем, используйте параллельную агрегацию для
повысить производительность, когда итерации выполняют сложные вычисления.
Благодарю.
Задача ещё не решена.