16

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

看来我需要一些类似的东西:

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

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

Roslyn似乎提供了一些在这里有用的工具。有没有办法连接到当前的编译管道以允许这样做?

编辑

好吧,我知道这是可能的,因为这些人做到了。问题是,如何

4

2 回答 2

11

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

听起来很棒。事实上,我们有一个与微软研究院非常相似的系统,但显然我无法讨论细节。

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

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

Roslyn 似乎提供了一些在这里有用的工具。有没有办法连接到当前的编译管道以允许这样做?

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

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

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

于 2011-12-28T19:39:23.317 回答
10

您不必扩展语言分析来做 Brahma 所做的事情。他刚刚实现了一个自定义查询提供程序,它解析表达式树并发出 GPGPU 代码(LINQ to SQL 做同样的事情,但使用 SQL)。

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

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

编辑

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

IL 重写既费时又费力,但你也可以走这条路。

于 2011-12-28T18:36:36.790 回答