Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Если же у нас есть p процессоров, то разобъём список x на p равных частей xi и с помощью левой свёртки для каждого xi вычислим h за время Cn/p, а затем за время Clog2p вычислим окончательный результат.Вы предлагаете вычислять каждую часть последовательной свёрткой? Почему бы и дальше не разбивать каждую часть на p частей (которые ещё на p частей и т.д. до достижения списков длины 1)? Тогда мы должны получить асимптотику O(logpn).
reducer_prod выглядит слишком сложным. Неужели нельзя ту же идею сжать в более читабельные рамки? Вот например как делается параллельное суммирование массива в .Net/C#:Parallel.ForEach(elems,
() => 0,
(n, loopState, localSum) =>
{
localSum += n;
return localSum;
},
localSum => Interlocked.Add(ref sum, localSum));
reducer_prod prod;
cilk_for (int i = 0; i < n; ++i) {
prod *= a[i];
}
Свёртки в Intel Cilk Plus