¿Qué significa enlace estático, dinámico y dinámico único?

9

Uso Intel MKL para BLAS y uso el Intel MKL Link Line Advisor para obtener ayuda con las opciones de línea de comandos.

El asesor proporciona opciones para la biblioteca dinámica estática, dinámica y única. que significan estas expresiones?

Ha habido numerosas publicaciones en SO con respecto a esto, pero todas se han centrado en desarrollar software en lugar de códigos científicos / matemáticos. ( Este fue especialmente útil)

  • ¿Cómo son estos términos relevantes para la computación paralela?
  • ¿Es uno mejor que el otro? (Sé que mejor debería definirse con mayor precisión, pero no sé cómo hacerlo a partir de ahora)
  • ¿Qué se usa más comúnmente y por qué?
  • ¿Qué debe tener en cuenta el programador al vincular?
Encuesta
fuente
Solo como una nota, si no lo ha visto, los compiladores Intel más nuevos (creo que la versión 11 y más recientes) proporcionan la -mklbandera que debería eliminar la necesidad de usar el asesor de línea de enlace en la mayoría de los casos.
Aesin
@Aesin, me preguntaba. ¿Es la forma más óptima de vinculación?
Investigación
Desafortunadamente, no lo sé. Realmente no he hecho ninguna prueba, y el manual no detalla lo que está haciendo o cómo se combina con otras opciones. Sin embargo, sí vincula estáticamente MKL si lo especifica -staticy lo vincula dinámicamente si no lo hace. Sin duda, es mucho mejor desde el punto de vista de la facilidad de uso, en cualquier caso.
Aesin

Respuestas:

14

Los términos enlace estático y enlace dinámico no están directamente relacionados con la computación paralela, aunque se sabe desde hace bastante tiempo que la carga dinámica (a diferencia de la carga de un ejecutable compilado estáticamente) no escala bien en los sistemas de archivos de red debido a la gran carga carga de metadatos causada por el cargador dinámico que busca rutas de carga para bibliotecas de destino.

Es difícil hacer declaraciones generales sobre si las bibliotecas estáticas o dinámicas son mejores en informática de alto rendimiento. Ciertamente, para la mayoría de las aplicaciones de supercomputación, es más simple y se prefiere vincular estáticamente. ¿Por qué es esto? En la generación actual de supercomputadoras, generalmente solo se ejecuta un trabajo por nodo, lo que reduce en gran medida los beneficios del consumo de memoria reducido debido a las bibliotecas compartidas. Además, los códigos informáticos científicos tienden a no ser muy sofisticados en términos de características de lenguaje o diseño de programas, y rara vez hacen uso de características de lenguaje que requieren carga dinámica (como módulos de complementos). Las bibliotecas dinámicas tienen la dificultad adicional de ser mucho menos portátiles en los sistemas operativos que las bibliotecas estáticas.

Como consecuencia de todo esto, la mayoría de los sistemas HPC usan compilación estática cuando están disponibles. Las bibliotecas estáticas se consideran más rápidas, más fáciles de instalar y mantener y, en general, más robustas. Los códigos HPC basados ​​en Python son una de las excepciones a esto, pero aún están sujetos a los problemas de rendimiento asociados con la carga dinámica (¡varios usuarios en scicomp están trabajando en este problema ahora mismo!).

Cuando elija la vinculación estática frente a la dinámica, debe considerar cómo y dónde se implementará su código, si es probable que las bibliotecas subyacentes cambien o se muevan, y las características de rendimiento de su sistema de archivos de red. También debe evaluar si necesita enlaces dinámicos, ya sea a través de una dependencia de la biblioteca o para interoperar con un lenguaje de script dinámico como Python.

Biblioteca dinámica única es un término específico de Intel. Se refiere al empaquetado de sus bibliotecas dinámicas en una única metabiblioteca para simplificar el proceso de vinculación. Si va a utilizar la vinculación dinámica con las bibliotecas de Intel, este formulario probablemente se prefiere a menos que esté haciendo algo complicado.

Aron Ahmadia
fuente
Excelente respuesta! Solo una cosa más: me doy cuenta de que la vinculación dinámica sería innecesaria y la elección será entre estática y dinámica única. Usted dice que debería elegir este último a menos que esté haciendo algo complicado (que no estoy haciendo). Entonces, ¿debo vincular usando Single Dynamic? [FWiW, estoy trabajando en los métodos del subespacio de Krylov]
Investigación
¡Lo siento! Me refería a que deberías usar estática por defecto, pero prefieres dinámica única a dinámica.
Aron Ahmadia
Hice algunos benchmarking y encontré: Dynamic : 0:42.92 Static : 0:42.93 Single Dynamic : 0:42.97promedió más de 1000 valores.
Investigación
1
Vale la pena señalar que en algunos sistemas HPC que tiene a estáticamente enlace - en los sistemas Blue Gene / L este es el caso, por ejemplo, debido a que la reducción de SO en los nodos de cómputo no admite la vinculación dinámica.
Aesin
1
Estoy un poco confundido por su afirmación: "En la generación actual de supercomputadoras, generalmente solo se ejecuta un trabajo por nodo, lo que reduce en gran medida los beneficios del consumo de memoria reducido debido a las bibliotecas compartidas". ¿Querías decir que solo hay un proceso por nodo? No estoy seguro de cómo un trabajo por nodo afecta la situación. Al vincular estáticamente cada proceso almacenará una copia completa del ejecutable que puede ser importante a medida que crecen los núcleos por procesador. La vinculación dinámica solo requerirá una copia de la biblioteca dinámica por espacio de memoria compartida.
andybauer