2010-02-16 5 views
12

He estado viendo LLVM durante bastante tiempo como un nuevo back-end para el lenguaje que estoy implementando actualmente. Parece tener un buen rendimiento, más bien API de generación de alto nivel, suficiente soporte de bajo nivel para optimizar optimizaciones exóticas. Además, y aunque no lo he comprobado por mi cuenta, Apple parece haber demostrado con éxito el uso de LLVM para los programas multi-core recolectados en la basura.¿Basura-colectores para multi-core llvm?

Hasta ahora, todo bien. Como estoy interesado tanto en recolección de basura como en multi-core, el siguiente paso sería elegir un recolector de basura de múltiples núcleos LLVM. Lo que me lleva a la pregunta: ¿qué hay disponible? Conozco el trabajo HLVM de Jon Harrop, pero eso es todo.

Tenga en cuenta que necesito multiplataforma, por lo que el GC de Apple probablemente no sea lo que estoy buscando (a menos que haya una versión multiplataforma). También tenga en cuenta que no tengo nada en contra de los recolectores de basura del mundo.

Gracias de antemano, Yoric

Respuesta

5

LLVM docs say that it does not support multi-threaded collectors todavía.

Como la matriz indica, infraestructura de recogida de basura de LLVM es ya adecuado para una amplia variedad de coleccionistas, pero actualmente no se extienden a programas multihilo. Este se agregará en el futuro ya que es de interés .

Los documentos hacen dicen que para hacer la recolección de basura multiproceso tiene que dejar el mundo y que esto es una cosa no portátil:

roscado denota un mutador multiproceso; el colector todavía debe detener el mutador ("detener el mundo") antes de comenzando el análisis de accesibilidad. Detener un mutador multiproceso es un problema complicado . Por lo general, requiere un código altamente específico de la plataforma en el tiempo de ejecución, y la producción de código de máquina cuidadosamente diseñado en puntos de seguridad.

Sin embargo, estado compartido entre subprocesos es un desagradable problema de escalado. Si su lenguaje se comunica únicamente a través del envío de mensajes entre 'tareas' y, por lo tanto, no había un estado compartido entre los subprocesos de trabajo, ¿podría utilizar un recopilador por subproceso para el montón por subproceso?

+0

Bueno, eso es lo que dicen los LLVM. Sin embargo, Apple parece tener un gc multi-core-compatible, y también lo hace el proyecto HLVM. – Yoric

+0

Y, como resulta, en mi idioma, la concurrencia se basa puramente en mensajes. Aún así, me pregunto cuánto soporte ofrece LLVM para un colector por subproceso/por montón de subprocesos. – Yoric

+0

los documentos dejan un resquicio para Apple mientras lo hacen parecer no portátil; Actualizaré la respuesta – Will

4

Las citas que proporcionará Will son sobre el soporte intrínseco de LLVM para GC, donde usted aumenta LLVM con código C++ diciéndole cómo recorrer la pila, interpretar los marcos de pila, inyectar barreras de lectura y escritura, y así sucesivamente. El objetivo principal de mi proyecto HLVM es ser útil con un mínimo esfuerzo y riesgo, así que elegí usar la pila de sombras para un "entorno no cooperativo" para evitar el pirateo en las partes internas inmaduras de LLVM. En consecuencia, esas declaraciones sobre el soporte intrínseco de LLVM para GC no se aplican al recolector de basura HLVM porque no usa esa infraestructura en absoluto. Mis resultados son extremadamente convincentes: puede lograr un rendimiento excelente con un mínimo esfuerzo (serial performance y parallel performance).

Creo que HLVM ya se ejecuta de fábrica en Unix, incluido Mac OS X, ya que solo requiere subprocesos POSIX. Estoy totalmente en desacuerdo con la afirmación de que escribir un GC que pare el mundo es difícil: me llevó 5 días escribir un recolector de basuras multinúcleo de 100 líneas y apenas sé nada sobre computadoras. No puedo creer que sea difícil para puerto a Windows tampoco.

+0

De acuerdo con la documentación de LLVM, la pila de sombras no es segura para subprocesos. Tengo curiosidad, ¿cómo manejas el paralelismo en ese contexto? – Yoric

+0

Probablemente se está refiriendo a la pila de sombras de LLVM pero estoy usando la mía propia y no la de ellos. Sin embargo, tengo curiosidad sobre cómo una pila de sombras no podría ser segura para subprocesos. Cada subproceso de mutador tiene su propia pila de sombras local de subprocesos que muta libremente, excepto cuando todos los mutadores están en pausa para un GC con lo cual el subproceso de GC (que es el que mutator incurre en el GC en mi caso) lee todas las acumulaciones de sombras. Por lo tanto, es obviamente "hilo seguro". –