3Da*_*ave 16 c# language-extension
使用Parallel Linq等系统,可以跨单个机器中的多个内核和线程分离匿名函数,查询等的执行.我希望能够使用标准语言结构(例如for循环(如Parallel.For()),ints,structs 等值类型)扩展它以跨多台机器运行,并将应用程序源修改保持在最低限度.理想情况下,这将允许我打开一个项目,向方法添加属性,并重新编译以获得对增强功能的访问.
看来我需要的东西是:
能够捕获已编译的代码块(例如lambda)并将其传递给在另一个节点上运行的工作进程以及所需的任何数据,或者
提供一个预处理器,它将捕获有问题的代码,在一个模板项目中编译它,它将替换变量引用等,引用一个类来处理网络通信,缓存和访问任何其他所需资产,并发送将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重写是耗时且艰苦的工作,但你也可以走这条路.
| 归档时间: |
|
| 查看次数: |
1141 次 |
| 最近记录: |