Чтобы гарантировать безопасность std::transform
и std::fill
параллельно, вам придется написать свою собственную версию. Общая реализация этих функций предназначена для последовательного выполнения.
Давайте возьмем std::fill
в качестве простого примера. При преобразовании в параллель вам нужно разбить функцию на более мелкие функции, которые могут выполняться асинхронно без каких-либо взаимозависимостей. Например, одна подфункция может заполнять первую половину, а вторая подфункция может заполнять вторую половину. Родительская функция должна будет делегировать (разветвлять) две подфункции и ждать, пока они завершат (объединить).
Большой вопрос заключается в том, могут ли накладные расходы, потраченные на подготовку во время выполнения для параллельного выполнения, компенсировать фактическое время параллельного выполнения. Большие заливки будут иметь более высокое обоснование, чем мелкие.
Возможно, лучшей идеей является создание поточно-ориентированных версий этих функций и параллельное выполнение потоков, а не разделение функций.
Прежде чем разбивать вещи на несколько потоков, сначала попробуйте оптимизировать в отношении данных. Найдите в Интернете Data Oriented Design . Статьи показали, что, оптимизируя выполнение для уменьшения количества кэш-памяти процессора, программа может работать значительно быстрее.