¿Cómo elegir entre std :: reduce y std :: acumular?

8

std::accumulatey std::reducehace casi lo mismo.

Resumen de lo std::reducedice todo:

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

En muchos casos, estas funciones deberían producir el mismo resultado final y exhibir la misma funcionalidad general. Es obvio que si tiene un cálculo de carga muy pesado, etc., puede experimentar std::reducepara la parrelización. Es decir. ¿Cuál es la sabiduría convencional aquí desde el punto de vista de las aves? ¿Debería siempre apegarse al std :: acumular contundente a menos que se optimice explícitamente? o simplemente debería usar de manera predeterminada std::reduce?

Si std::reduce(con la política predeterminada / sin ejecución elegida) siempre es al menos tan rápido como std::accumulate(guarde algunas instrucciones), entonces creo que acumular solo debe usarse cuando el orden es estricto.

Darune
fuente

Respuestas:

7

Sí, siempre lo usaría a std::reducemenos que sepa que necesita la garantía de pedido de std::accumulate. Esto le da al compilador una mayor libertad para optimizar, y en el peor de los casos es idéntico de todos modos.

Anthony Williams
fuente