c++ stl parallel-processing concurrent-programming

c++ - Algoritmos STL y programación concurrente.



parallel-processing concurrent-programming (4)

¿Puedo ejecutar en paralelo alguna de las operaciones de algoritmo / contenedor STL como std :: fill , std :: transform si habilito OpenMP para mi compilador? Estoy trabajando con MSVC 2008 en este momento. ¿O tal vez hay otras formas de hacerlo concurrente?

Gracias.



Los estándares actuales de C ++ no hablan de subprocesos, así que no. Here hay una declaración más o menos original sobre la seguridad de los hilos STL.

Editar:

Mire una implementación común (GCC) de std::fill :

template<typename _ForwardIter, typename _Tp> void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value) { for ( ; __first != __last; ++__first) *__first = __value; }

Es obvio que no es seguro para la ejecución paralela (lo que requeriría una implementación especializada).

Y aquí está la extensión GCC para el modo paralelo .


Visual Studio 2010 proporciona la biblioteca de patrones paralelos que tiene algoritmos de estilo STL que se ejecutan en paralelo. Por supuesto, esto es específico de Microsoft para VS2010 (y más, supongo).


Para garantizar que std::transform y std::fill sean seguros en paralelo, tendrá que escribir su propia versión. La implementación común de estas funciones es para la ejecución secuencial.

Tomemos std::fill como un ejemplo simple. Al convertirse en paralelo, deberá dividir la función en funciones más pequeñas que se puedan ejecutar de forma asíncrona sin interdependencias. Por ejemplo, una sub-función podría llenar la primera mitad y la segunda sub-función podría llenar la segunda mitad. La función principal tendría que delegar (bifurcar) las dos subfunciones y esperar a que terminen (unirse).

La pregunta más importante es si la sobrecarga gastada en la preparación en tiempo de ejecución para la ejecución paralela puede compensar el tiempo de ejecución paralelo real. Los rellenos grandes tendrían una mayor justificación que los rellenos más pequeños.

Quizás una mejor idea es hacer versiones seguras para subprocesos de estas funciones y hacer que los subprocesos se ejecuten en paralelo, en lugar de dividir las funciones.

Antes de dividir las cosas en varios subprocesos, primero intente optimizar en referencia a los datos. Buscar en la web para el diseño orientado a datos . Los artículos han demostrado que al optimizar la ejecución para reducir las fallas en la memoria caché del procesador, un programa puede ejecutarse significativamente más rápido.