gpt4 book ai didi

c# - 我们可以获得委托(delegate)的身份吗?

转载 作者:可可西里 更新时间:2023-11-01 07:57:51 25 4
gpt4 key购买 nike

是否可以生成委托(delegate)的身份以将其与其他委托(delegate)区分开来?想想这段代码:

Func<int, int, int> delegate1 = a, b => a + b;
Func<int, int, int> delegate2 = a, b => a + b;
Func<int, int, int> delegate3 = a, b => a - b;
let id1 = id(delegate1);
let id2 = id(delegate2);
let id3 = id(delegate3);
Assert(id1 == id2);
Assert(id1 != id3);

我要解决的问题是,我想在.NET中缓存一些JIT编译的GPU代码。为了方便使用,我想让用户发送委托(delegate),如果委托(delegate)相同,我们尝试从缓存中找出 GPU 代码,而不是每次都进行 JIT 编译:

Parallel(outputA, inputA1, inputA2, a, b => a + b); //should JIT compile GPU code, and cache it by its identity
Parallel(outputB, inputB1, inputB2, a, b => a + b); //should NOT JIT compile GPU code, and use the cached GPU code by its identity

一种可能的解决方案是比较表达式字符串,但它仍然无法捕获clouser,例如:

int c = 0;
Expression<Func<int, int, int>> delegate1 = (a, b) => a + b + c;
c += 1;
Expression<Func<int, int, int>> delegate2 = (a, b) => a + b + c;
Expression<Func<int, int, int>> delegate3 = (a, b) => a - b - c;
Console.WriteLine(delegate1);
Console.WriteLine(delegate2);
Console.WriteLine(delegate1.ToString() == delegate2.ToString());
Console.ReadKey();

感谢@SWeko 和@Luaan 指出,在上面的示例中,delegate1delegate2 实际上是相同的。但是缓存委托(delegate)的目的在于以下用法:

int c = 1;
Parallel(outputA, inputA1, inputA2, (a,b) => a+b); //do JIT compile of GPU code
c += 1;
Parallel(outputB, inputB1, inputB2, (a,b) => a+b); //as the delegate is same then the previouse one, it will not do JIT GPU code compiling, but then, that is wrong!

最佳答案

一种(相对幼稚的)方法是使用 Expression<Func> s 而不是 Func他们自己,因为他们有更详细的信息,可以让你分析东西。例如

Expression<Func<int, int, int>> delegate1 = (a, b) => a + b;
Expression<Func<int, int, int>> delegate2 = (a, b) => a + b;
Expression<Func<int, int, int>> delegate3 = (a, b) => a - b;
var id1 = id(delegate1);
var id2 = id(delegate2);
var id3 = id(delegate3);
Debug.Assert(id1 == id2);
Debug.Assert(id1 != id3);

哪里id就像:

public static string id(Expression<Func<int, int, int>> expression)
{
return expression.ToString();
}

通过测试。


请注意,这不是一个完整的解决方案,并且存在很多问题。如果你需要一个全面的比较,你需要考虑表达式的全部性质,包括(但不限于)进出表达式的类型、方法调用、闭包访问等等。我认为这在一般情况下根本无法解决,但通常它可以限制在一些更特殊的情况下,可以解决。

关于c# - 我们可以获得委托(delegate)的身份吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32943724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com