Como escolher entre std :: reduzir e std :: acumular?

8

std::accumulatee std::reducefaz quase a mesma coisa.

Resumo de std::reducediz tudo:

similar to `std::accumulate`, except out of order 

Em muitos casos, essas funções devem produzir o mesmo resultado final e exibir a mesma funcionalidade geral. É óbvio que, se você tiver alguma computação de carga muito pesada, etc., poderá experimentar std::reducea parrelização. Ou seja. qual é a sabedoria convencional aqui do ponto de vista dos pássaros - você deve sempre se ater ao std :: acumulate, a menos que seja explicitamente otimizado? ou deve usar como padrão std::reduce?

Se std::reduce(com a política padrão / sem execução escolhida) for sempre pelo menos tão rápido quanto std::accumulate(salve algumas instruções), acho que o acúmulo só deve ser usado quando a ordem é rigorosa.

darune
fonte

Respostas:

7

Sim, eu sempre usaria a std::reducemenos que você saiba que precisa da garantia em ordem std::accumulate. Isso dá ao compilador maior liberdade para otimizar e, na pior das hipóteses, é idêntico de qualquer maneira.

Anthony Williams
fonte