3

我正在考虑将处理器密集型 32 位 .NET 4 (C#) 控制台应用程序移植到 64 位。它是一种运行大约五个小时的并行数字运算算法。

我对性能优势有所了解,但不确定如何更改代码以充分利用 64 位架构。例如,我是否应该考虑将所有 Int32 类型更改为 Int64 等?

在哪里可以找到一些全面的资源来了解移植到 x64 时的优化注意事项?搜索主要是关于 x64 架构的一般信息。

4

4 回答 4

2

你的努力会得到回报的希望很小。x64 内核的运行速度与 x86 内核相同,时钟速度相同,并且受硅物理特性的限制。x64 内核的一个明显优势是它可以同时处理 64 位,是 x86 内核数量的两倍。但在实践中,很少有现实世界的问题实际上需要该范围。大多数整数问题在 +/- 20 亿范围内都能正常工作。从您的代码中很容易看出,如果您的最内层循环中有很多long而不是int变量,那么您将领先。

x64 内核的一个显着缺点是它消耗可用缓存的速度要快得多。这也受到硅的限制,芯片上只能容纳这么多内存。任何指针都是大小的两倍,8 字节而不是 32 位模式下的 4 字节。指针用于任何对象引用。缓存在现代内核上非常重要,与内核的速度相比,内存总线非常缓慢。x64 有 8 个以上的 cpu 寄存器(r8 到 r15)在一定程度上抵消了这个缺点。

最终效果是 32 位代码的执行速度通常比 64 位代码快一点。只有当您的程序因不得不将其处理的数据塞入 2 GB 的地址空间而陷入困境时,您才能从 64 位代码中获益。换句话说,必须使用文件或内存映射文件来避免内存不足。如果您的应用程序受到计算限制,如您的问题中所建议的,那么您不太可能领先。

于 2012-08-21T11:31:29.820 回答
0

对于纯 .NET 代码,您似乎无法优化自己。编译到任何 cpu,IL 编译器将针对 x64 进行优化,例如额外的内存空间和更多的寄存器。

请参阅如何为 64 位编译我的应用程序使其更快或更好?类似的讨论

于 2012-08-21T09:21:57.583 回答
0

将 32 位类型更改为 64 位类型本身并没有帮助。32 位操作都与 x64 上的 64 位操作一样快或更快。不同的是,64 位操作比 32 位模式更快。因此,例如,如果您使用一个 int32 数组,并且您也可以使用一个长度为一半的 int64 数组,那么它可能会有所帮助。

于 2012-08-21T09:28:18.243 回答
0

您没有提到您的应用程序是否也是内存密集型的。但是,请注意,在进行此转换时,您的应用程序内存占用量预计会显着增长。由于所有引用类型指针现在占用了两倍的空间。换句话说,虽然你有一个有效的无限地址空间,但有效的内存利用率仍然受到 RAM 的限制。

于 2012-08-21T10:13:31.467 回答