实现C#语言扩展

3Da*_*ave 16 c# language-extension

使用Parallel Linq等系统,可以跨单个机器中的多个内核和线程分离匿名函数,查询等的执行.我希望能够使用标准语言结构(例如for循环(如Parallel.For()),ints,structs 等值类型)扩展它以跨多台机器运行,并将应用程序源修改保持在最低限度.理想情况下,这将允许我打开一个项目,向方法添加属性,并重新编译以获得对增强功能的访问.

看来我需要的东西是:

  1. 能够捕获已编译的代码块(例如lambda)并将其传递给在另一个节点上运行的工作进程以及所需的任何数据,或者

  2. 提供一个预处理器,它将捕获有问题的代码,在一个模板项目中编译它,它将替换变量引用等,引用一个类来处理网络通信,缓存和访问任何其他所需资产,并发送将DLL生成到在其他计算机上运行的任何可用工作节点.

Roslyn似乎提供了一些在这里很有用的工具.有没有办法挂钩到当前的编译管道允许这个?

编辑

好吧,我知道这是可能的,因为这些人做到了.问题是,怎么样

Eri*_*ert 11

使用Parallel Linq等系统,可以跨单个机器中的多个内核和线程分离匿名函数,查询等的执行.我希望能够使用标准语言结构(例如for循环(如Parallel.For()),值类型(如整数,结构等)来扩展它以跨多台机器运行,并将应用程序源修改保持在最低限度.

听起来不错.事实上,我们在Microsoft Research中有一个非常类似的系统,但显然我无法讨论细节.

我需要能够捕获已编译的代码块(例如lambda)并将其传递给在另一个节点上运行的工作进程以及所需的任何数据

好的,你已经明白了.我们将该功能添加到C#3中.这就是LINQ to SQL的工作原理.不知何故,LINQ查询必须进入数据库.在客户端计算机上查询已编译的lambda,将其转换为发送到服务器节点的查询,然后将结果发回.

Roslyn似乎提供了一些在这里很有用的工具.有没有办法挂钩到当前的编译管道允许这个?

这不是罗斯林的目的; Roslyn不是要为C#语言添加新功能.这是为了更容易分析代码来构建重构引擎之类的东西.

您不需要挂钩编译管道.PLINQ不会更改编译器,LINQ to SQL不会更改编译器,依此类推.将lambda转换为表达式树时,编译器会发出代码,该代码在运行时创建表示树的表达式树.您可以查询该表达式树,将其序列化到网络中的另一台计算机,对其进行反序列化,将其转换为委托并运行它,如果这是您喜欢的事情.

您可能需要编写自己的表达式树序列化器和反序列化器,但它们是非常简单的数据结构.作为一个不可变树应该使它们很容易序列化和反序列化; 它们不能真正形成复杂的网络,因为它们总是由叶节点构成.


Ron*_*lic 10

你不必将语言延伸到Brahma做的事情.他刚刚实现了一个自定义查询提供程序,它解析表达式树并发出GPGPU代码(LINQ to SQL做同样的事情,但使用SQL).

我在这里链接了MSDN的基本指南,可以帮助您启动并运行实现IQueryable提供程序.

困难的部分将遍历表达式树并生成OpenCL代码.一旦你能做到这一点,你只需将它传递给Cloo,你应该运行.

编辑

您使用属性将编译标准.NET代码的工具链接到GPU代码[Kernel].他们通过使用后构建工具查找已编译IL中的属性来执行此操作,并执行IL重写以生成GPU调用.这与AOP解决方案PostSharp类似.

IL重写是耗时且艰苦的工作,但你也可以走这条路.