online - convertir de c# ac
Implementando extensiones de lenguaje C# (2)
Al usar sistemas como Parallel Linq , es posible dividir la ejecución de funciones anónimas, consultas, etc. en múltiples núcleos y subprocesos dentro de una sola máquina. Me gustaría la posibilidad de extender esto para ejecutarse en múltiples máquinas utilizando construcciones de lenguaje estándar, como para bucles (como Parallel.For()
), tipos de valor como int
s, struct
s, etc., y mantener las modificaciones de la fuente de la aplicación a un mínimo. Idealmente, esto me permitiría abrir un proyecto, agregar un atributo a un método y volver a compilar para obtener acceso a la funcionalidad mejorada.
Parece que necesitaría algo como:
La capacidad de capturar un bloque de código compilado (como un lambda) y pasarlo a un proceso de trabajo que se ejecuta en otro nodo, junto con cualquier información que se requiera, o
Proporcione un preprocesador que capture el código en cuestión, lo compile en una especie de proyecto de plantilla que reemplace las referencias de variables, etc., con referencias a una clase que maneje la comunicación de red, el almacenamiento en caché y el acceso a cualquier otro activo requerido, y envíe el DLL resultante a cualquier nodo de trabajador disponible que se ejecute en otras máquinas.
Roslyn parece proporcionar algunas herramientas que serían útiles aquí. ¿Hay alguna forma de conectarse a la compilación actual para permitir esto?
Editar
Bien, sé que esto es posible, porque estos chicos lo hicieron . La pregunta es, ¿cómo ?
Al usar sistemas como Parallel Linq, es posible dividir la ejecución de funciones anónimas, consultas, etc. en múltiples núcleos y subprocesos dentro de una sola máquina. Me gustaría tener la posibilidad de extender esto para ejecutarse en múltiples máquinas utilizando construcciones de lenguaje estándar, como para bucles (como Parallel.For ()), tipos de valor como ints, estructuras, etc., y mantener las modificaciones de la fuente de la aplicación al mínimo .
Suena genial. De hecho, tenemos un sistema muy parecido al de Microsoft Research, aunque obviamente no puedo discutir los detalles.
Necesito la capacidad de capturar un bloque de código compilado (como un lambda) y pasarlo a un proceso de trabajo que se ejecuta en otro nodo, junto con cualquier información que se requiera
OK, lo tienes Agregamos esa característica a C # 3. Así es como funciona LINQ to SQL. De alguna manera, la consulta LINQ debe ingresar a la base de datos. La lambda compilada se interroga en la máquina cliente, se transforma en una consulta que se envía al nodo del servidor y, a continuación, se devuelve el resultado.
Roslyn parece proporcionar algunas herramientas que serían útiles aquí. ¿Hay alguna forma de conectarse a la compilación actual para permitir esto?
Ese no es el propósito de Roslyn; Roslyn no se trata de agregar nuevas funciones al lenguaje C #. Se trata de hacer que sea más fácil analizar el código para construir cosas como motores de refactorización.
No es necesario enganchar en la tubería de compilación. PLINQ no cambia el compilador, LINQ to SQL no cambia el compilador, y así sucesivamente. Cuando convierte un lambda en un árbol de expresiones, el compilador emite un código que crea un árbol de expresiones en tiempo de ejecución que representa la lambda. Puede interrogar ese árbol de expresiones, serializarlo a otra máquina en su red, deserializarlo, convertirlo en un delegado y ejecutarlo si ese es el tipo de cosas que le gusta hacer.
Necesitará escribir su propio serializador de árbol de expresiones y deserializador probablemente, pero son estructuras de datos bastante sencillas. Ser un árbol inmutable debería hacer que sean bastante fáciles de serializar y deserializar; realmente no pueden formar redes complejas, ya que siempre se construyen desde nodos de hojas hacia arriba.
No tienes que extender el lenguaje del lenguaje para hacer lo que hace Brahma. Acaba de implementar un proveedor de consultas personalizado que analiza los árboles de expresión y emite el código GPGPU (LINQ to SQL hace lo mismo pero con SQL).
here vinculé una guía básica en MSDN que puede ponerlo en funcionamiento implementando un proveedor de IQueryable
.
La parte difícil será atravesar los árboles de expresiones y generar código OpenCL. Una vez que puedes hacer eso, simplemente dáselo a Cloo y deberías estar corriendo.
Editar
Usted vinculó una herramienta que compila el código .NET estándar al código de la GPU con un atributo [Kernel]
. Hacen esto haciendo que una herramienta posterior a la compilación busque los atributos en el IL compilado y realicen la reescritura de IL para generar llamadas de GPU. Esto es similar a PostSharp , una solución AOP.
La reescritura de IL requiere mucho tiempo y es un trabajo arduo, pero también podría ir por este camino.