Compartir a través de


Migrar de OpenMP al Runtime de simultaneidad

El Runtime de simultaneidad ofrece una variedad de modelos de programación. Estos modelos pueden superponerse o complementar los modelos de otras bibliotecas. En los documentos de esta sección se compara OpenMP con el runtime de simultaneidad y se proporcionan ejemplos sobre cómo migrar el código existente de OpenMP para usar el runtime de simultaneidad.

El modelo de programación de OpenMP se define con un estándar abierto y tiene enlaces bien definidos con los lenguajes de programación Fortran y C/C++. Las versiones 2.0 y 2.5 de OpenMP, compatibles con el compilador de Microsoft C++, son apropiadas para los algoritmos paralelos que son iterativos; es decir, efectúan una iteración paralela en una matriz de datos. OpenMP 3.0 admite tareas no iterativas e iterativas.

OpenMP es más eficaz cuando el grado de paralelismo se determina previamente y coincide con los recursos disponibles en el sistema. El modelo de OpenMP es una muy buena opción para la informática de alto rendimiento, en la que los problemas de cálculo considerables se distribuyen por los recursos de procesamiento de un equipo. En este escenario, el entorno de hardware es fijo por lo general y el desarrollador puede suponer razonablemente que tendrá acceso exclusivo a los recursos informáticos en el momento en que se ejecute el algoritmo.

También puede haber entornos informáticos con menos restricciones que no sean tan idóneos para OpenMP. Por ejemplo, los problemas recursivos (como el algoritmo quicksort o la búsqueda de un árbol de datos) son más difíciles de implementar con OpenMP 2.0 y 2.5. El runtime de simultaneidad complementa la funcionalidad de OpenMP proporcionando la biblioteca de agentes asincrónicos y la biblioteca de patrones de procesamiento paralelo (PPL). La biblioteca de agentes asincrónicos admite paralelismo de tareas generales; PPL admite tareas paralelas más específicas. El runtime de simultaneidad proporciona la infraestructura necesaria para realizar operaciones en paralelo para que pueda centrarse en la lógica de la aplicación. Sin embargo, como el runtime de simultaneidad permite varios modelos de programación, su sobrecarga de programación puede ser mayor que la de otras bibliotecas de simultaneidad, como OpenMP. Por lo tanto, se recomienda probar el rendimiento de forma incremental al convertir el código OpenMP existente para que use el runtime de simultaneidad.

¿Cuándo se debe migrar de OpenMP al runtime de simultaneidad?

Puede resultar ventajoso migrar el código de OpenMP existente para que use el runtime de simultaneidad en los casos siguientes.

Casos Ventajas del runtime de simultaneidad
Necesita un marco de programación simultáneo extensible. Muchas de las características del Runtime de simultaneidad se pueden extender. También puede combinar características existentes para crear nuevas características. Dado que OpenMP se basa en las directivas de compilador, no se puede ampliar fácilmente.
La aplicación se beneficiaría del bloqueo cooperativo. Cuando una tarea se bloquea porque requiere un recurso que aún no está disponible, el runtime de simultaneidad puede realizar otras tareas mientras la primera tarea espera al recurso.
La aplicación se beneficiaría del equilibrio de carga dinámico. El runtime de simultaneidad usa un algoritmo de programación que ajusta la asignación de recursos informáticos a medida que cambian las cargas de trabajo. En OpenMP, cuando el programador asigna recursos informáticos a una región paralela, esas asignaciones de recursos son fijas durante todo el cálculo.
Necesita soporte para el manejo de excepciones. PPL le permite detectar excepciones dentro y fuera de una región o bucle paralelos. En OpenMP, debe controlar la excepción dentro de la región o bucle paralelos.
Necesita un mecanismo de cancelación. PPL permite a las aplicaciones cancelar tareas individuales y árboles paralelos de trabajo. OpenMP requiere que la aplicación implemente su propio mecanismo de cancelación.
Necesita código paralelo para finalizar en un contexto diferente del que se inicia. El runtime de simultaneidad permite iniciar una tarea en un contexto y, a continuación, esperar o cancelar esa tarea en otro contexto. En OpenMP, todo el trabajo paralelo debe finalizar en el contexto desde el que se inicia.
Necesita compatibilidad mejorada con la depuración. Visual Studio proporciona las ventanas Pilas paralelas y Tareas paralelas para que pueda depurar aplicaciones multiproceso más fácilmente.

Para más información sobre la compatibilidad de la depuración con el runtime de simultaneidad, consulte Usar la ventana Tareas, Uso de la ventana Pilas paralelas y Tutorial: Depuración de una aplicación paralela.

¿Cuándo NO se debe migrar de OpenMP al runtime de simultaneidad?

En los casos siguientes se indica cuándo no es recomendable migrar el código de OpenMP existente para usar el runtime de simultaneidad.

Casos Explicación
La aplicación ya cumple sus requisitos. Si está satisfecho con el rendimiento de la aplicación y con la compatibilidad de depuración actual, puede que no sea recomendable llevar a cabo la migración.
Los cuerpos de bucle paralelos realizan poco trabajo. Es posible que la sobrecarga del programador de tareas del runtime de simultaneidad no supere las ventajas de ejecutar el cuerpo de bucle en paralelo, especialmente cuando este es relativamente pequeño.
La aplicación está escrita en C. Dado que el runtime de simultaneidad usa muchas características de C++, es posible que no sea adecuado si no se puede escribir código que permita a la aplicación C usarlo por completo.

Procedimiento para convertir un bucle OpenMP paralelo para usar el Runtime de simultaneidad

Dado un bucle básico que usa las directivas OpenMP parallel y for, se muestra cómo convertir el bucle para que use el algoritmo concurrency::parallel_for del runtime de simultaneidad.

Procedimiento para convertir un bucle OpenMP que usa la cancelación para usar el Runtime de simultaneidad
Dado un bucle parallelfor de OpenMP que no necesita que se ejecuten todas las iteraciones, se muestra cómo convertir el bucle para que use el mecanismo de cancelación del runtime de simultaneidad.

Procedimiento para convertir un bucle OpenMP que usa el control de excepciones para usar el Runtime de simultaneidad
Dado un bucle parallelfor de OpenMP que realiza el control de excepciones, se muestra cómo convertir el bucle para que use el mecanismo de control de excepciones del runtime de simultaneidad.

Procedimiento para convertir un bucle OpenMP que usa una variable de reducción para usar el Runtime de simultaneidad
Dado un bucle parallelfor de OpenMP que usa la cláusula reduction, se muestra cómo convertir el bucle para que use el runtime de simultaneidad.

Consulte también

Runtime de simultaneidad
OpenMP
Biblioteca de modelos de procesamiento paralelo (PPL)
Biblioteca de agentes asincrónicos