Pregunta

Puede alguno de los algoritmos de STL / operaciones de contenedores como std :: relleno , std :: transformar ser ejecutado en paralelo si habilito OpenMP para mi compilador? Estoy trabajando con MSVC 2008 en el momento. O tal vez hay otras maneras de hacerlo concurrente?

Gracias.

¿Fue útil?

Solución

Hay una serie de proyectos que tienen como objetivo tener bibliotecas de tipos STL paralelas:

  1. OpenMP multihilo Template Library
  2. libstdc ++ paralelo
  3. HPC ++ paralelo estándar Template Library
  4. patrones paralelos Biblioteca (sin vergüenza prestado de la respuesta de AshleysBrain)

Otros consejos

Para std::transform garantía y std::fill a ser paralela de fallos, que tendrá que escribir su propia versión. La aplicación común de estas funciones es para ejecución secuencial.

Tomemos std::fill como un ejemplo sencillo. En la conversión a paralelo, tendrá que romper la función en funciones más pequeñas que se pueden ejecutar de forma asincrónica sin interdependencias. Por ejemplo, un sub-función podría llenar la primera mitad y la segunda sub-función podría llenar el segundo medio. La función madre tendría que delegar (tenedor) los dos subfunciones, y esperar a que termine (unirse).

La pregunta más importante es si o no los gastos generales empleado en la preparación de tiempo de ejecución para la ejecución en paralelo puede compensar el tiempo de ejecución en paralelo real. Grandes rellenos tendrían una justificación más altos que los rellenos más pequeños.

Tal vez una mejor idea es hacer versiones compatibles con el proceso de estas funciones y tienen los hilos se ejecutan en paralelo, en lugar de dividir las funciones.

Antes de cosas dividiéndose en varios subprocesos, probar primero la optimización en referencia a los datos. Buscar en la Web Diseño Orientado datos . Los artículos han demostrado que mediante la optimización de la ejecución para reducir los errores de caché del procesador, un programa puede funcionar mucho más rápido.

Las normas actuales de C ++ no hablar de las discusiones en absoluto, por lo que no. Aquí es más o menos original declaración acerca de la seguridad de rosca STL.

Editar:

vistazo a uno común (CCG) la implementación 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 en paralelo (que requeriría la aplicación especializada.)

Y aquí es la extensión del CCG para paralelo Modo .

Visual Studio 2010 proporciona la patrones paralelos Biblioteca que tiene algoritmos STL estilo que se ejecutan en paralelo. Por supuesto, esto es específico de Microsoft a VS2010 (en adelante, supongo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top