сумма чисел в векторе
мне нужно разделить вектор на произвольное количество частей, затем посчитать сумму в каждой части, эту сумму запихнуть в другой вектор( вектор сумм), а затем посчитать сумму всех сумм. Подскажите как сделать алгоритм что бы подсчитать кусок и переходить к части что осталось или как поменять мой, так как моя функция выдает не правильный результат, например на вектор в размере 100 000 он должен выдавать 5000050000, а выдает другое число.
long long Sum_MT3(std::vector <int>a)
{
int n = processor_count * 2;
int count = n;
int64_t lenght = a.size() / n;
int64_t sum3;
while(count!=0)
{
if (a.size() % 2 == 0)
{
//n = a.size() / 2;
for ( int64_t i = 0; i <= lenght; i++)
{
sum3 = SumOfPart(a, 0, lenght);
d.push_back(sum3);
}
count--;
a.resize(a.size() - lenght);
}
sum3 = (SumOfPart(d, 0, d.size()));
return sum3;
}
Ответы (1 шт):
Код:
#include <future>
#include <vector>
#include <numeric>
#include <iostream>
const std::size_t chunks_num = 3;
auto main() -> int
{
std::vector<int> v;
v.resize(10001, 3); // sum = 10001 * 3 = 30003
std::vector<std::future<int>> futures;
std::size_t offset = 0;
for (std::size_t i = 0; i < chunks_num; ++i)
{
const auto length =
(chunks_num - i) > 1 // take rest on the last iteration
? v.size() / chunks_num
: v.size() - offset;
auto future =
std::async(std::launch::async,
&std::accumulate<decltype(v)::const_iterator, int>,
std::cbegin(v) + offset,
std::cbegin(v) + offset + length,
0);
offset += length;
futures.push_back(std::move(future));
}
const auto sum =
std::accumulate(futures.begin(), futures.end(), 0, [](int base, std::future<int>& f)
{ return base + f.get(); });
std::cout << "Sum: " << sum << std::endl;
return 0;
}
Пояснения: v - исходный вектор, он условно разбивается на chunks_num частей, каждая из которых передается на вход алгоритму accumulate (из стандартной библиотеки) запускаемому в отдельном потоке.
Я не стал создавать отдельный вектор для сумм, так как объекты std::future<int> уже лежат в векторе. Все, что нам нужно сделать - дождаться результата и обновить сумму:
return base + f.get();
^
// wait for the result
P.S. Здесь правильнее использовать thread pool, так как в общем случае запуск N потоков для N вычислительных задач - стратегия проигрышная.
UPD.: вариант, предложенный @HolyBlackCat
#include <numeric>
#include <execution>
auto main() -> int
{
std::vector<int> v { 0, 1, 2, 3 };
auto r = std::reduce(std::execution::par_unseq, v.cbegin(), v.cend(), 0);
return r;
}