Реализован ли std :: copy для использования нескольких потоков? - PullRequest
0 голосов
/ 16 марта 2020

Я хотел бы скопировать один вектор в другой как можно быстрее.

Один метод использует std::copy:

std::copy(other_vector().begin(),other_vector().end(),this_vector.begin());

Но поскольку векторы довольно длинные, мне было интересно, была ли реализована функция std::copy, чтобы она использовала несколько потоков.

Я мог бы предоставить собственную логику c для разделения векторов на равные несвязанные части, чтобы копировать элементы по отдельности, но я бы не хотел заново изобретать колесо.

Так std::copy работает с несколькими потоками?

Ответы [ 2 ]

4 голосов
/ 16 марта 2020

Вам повезло с C ++ 17, который вы получили

template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, ForwardIt2 d_first );

см. https://en.cppreference.com/w/cpp/algorithm/copy

3 голосов
/ 16 марта 2020

Нет, перегрузка std::copy, которую вы показываете в своем вопросе, вообще не может быть реализована для параллельного выполнения, потому что она указана для последовательного копирования элементов в порядке от первого до последнего. Вероятно, он никогда не реализуется для параллельного выполнения ни при каких обстоятельствах.

Начиная с C ++ 17 существуют параллельные расширения стандартных библиотечных алгоритмов, которые принимают дополнительный первый параметр, определяющий политику выполнения, который может быть параллельным, при условии, что стандартная библиотека реализует его таким образом, например (требуется #include<execution>):

std::copy(std::execution::par, other_vector().begin(), other_vector().end(), this_vector.begin());

См. cppreference.com для различных вариантов политики выполнения и их конкретные значения c.

Это еще не полностью реализовано во всех компиляторах / стандартных библиотеках, хотя и может потребоваться дополнительные опции компилятора. См. « Стандартизация параллелизма TS » в таблице поддержки компилятора cppreference.com .

...