【问题标题】:how to use power of 2 * Xeon E5?如何使用2*Xeon E5的电源?
【发布时间】:2012-06-20 01:58:00
【问题描述】:

我有两台服务器,一台运行一个 E3-1220 处理器,另一台运行两个 E5-2640 处理器。 http://ark.intel.com/compare/52269,64591

问题是两个处理器服务器的成本要高 5 倍,但我的程序执行速度要慢 2 倍,请参阅我在 stackoverflow 上的问题Threadpool program runs much slower on much faster server)

我编写了这个简单的程序来比较 E3-1220 和 E5-2640 它什么也没做,只是我在现实世界中做的事情:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace TestSpeed
{
    class Program
    {
        private static double a;
        private static double b;
        private static double c = 0.34;
        private static double d = 0.15;
        private static double e = 0.25;
        private static double f = 0.03;
        private static double g = 8;

        static void Main(string[] args)
        {
            Stopwatch sw = Stopwatch.StartNew();
            for (int i = 0; i < 1000000000; i++)
            {
                double e = a;
                a = 1;
                double f = b;
                b = 1;
                if (true)
                {
                    double h = 1.83;

                    double j = Math.Ceiling(h/d);
                    if (j <= c)
                    {
                        c = Math.Ceiling(h/d + e);
                    }
                    else if (j > c)
                    {
                        c = Math.Ceiling(h/d - e);
                    }
                    if (c <= -0.5)
                    {
                        a = a - f*c;
                    }

                    double k = Math.Floor(h/d);
                    if (k <= g)
                    {
                        g = Math.Floor(h/d + e);
                    }
                    else if (k > g)
                    {
                        g = Math.Floor(h/d - e);
                    }
                    if (g > 0.5)
                    {
                        b = b + f*g;
                    }
                }

                bool result = (Math.Abs(e - a) > 0) ||
                              (Math.Abs(f - b) > 0);
            }
            long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
            Console.WriteLine(time);

        }
    }
}

E5-2640 是新的 Intel 处理器,我想它应该至少比以前的 E3-1220 好一点,几乎便宜 5 倍。

但结果是:Xeon E5-2640 是 31182(~31 秒),Xeon E3-1220 是 26650(~26 秒)。 所以比率是 31182/26650 = 1.17 时钟比为 3 / 2.5 = 1.2

所以至强 E3 和至强 E5 之间绝对没有区别。 E3 的时钟比提高了 20%,因此工作速度提高了 20%。我该怎么办,也许我可以使用一些特殊的 Xeon E5 指令?

而且非常烦人的是,在实际应用中至强 E5 比至强 E3 慢 2 倍(!!)...(参考我的链接问题)

所以问题是 - 我可以做些什么来使用 2 * Xeon E5 配置的力量?我应该使用哪些技术,以及如何在 C# 上编程以利用多处理器配置的强大功能?

我很失望,我花了 10 000 美元购买了执行我的程序的服务器比我以 1 500 美元购买的现有服务器慢 2 倍

【问题讨论】:

    标签: c#


    【解决方案1】:

    根据我的一点经验,Task Parallel Library 在创建正确数量的线程以最大化 CPU 方面做得很好。查看http://msdn.microsoft.com/en-us/library/dd537609.aspx

    【讨论】:

    • 我正在大量使用Task,但便宜的 Xeon E3-1220 仍然更快
    【解决方案2】:

    首先:这个测试不决定什么服务器是最好的(10000美元或1500美元),因为在价格中包含了几个东西,比如材料的质量,电源,高清等。等等。您的测试可以计算算术运算的数量(主要涉及处理器和内存总线)。

    在我的 Xeon E5410 @ 2.33GHz - 4GB RAM(虚拟机 - 4 核)中,我得到了以下结果:

    425872098
    Time Elapsed: 00:05:56.9214226
    

    但最大的错误是:服务器只使用了 25% 的功率(1 个核心)。

    所以我使用了Parallel Task Library,4 个核心以 100% 的功率耗尽。

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace TestSpeed
    {
        class Program
        {
            private static double a;
            private static double b;
            private static double c = 0.34;
            private static double d = 0.15;
            private static double e = 0.25;
            private static double f = 0.03;
            private static double g = 8;
    
            static void Main(string[] args)
            {
                Stopwatch sw = Stopwatch.StartNew();
                Parallel.For(0, 1000000000, (p) =>
                {
                    double e = a;
                    a = 1;
                    double f = b;
                    b = 1;
                    if (true)
                    {
                        double h = 1.83;
    
                        double j = Math.Ceiling(h / d);
                        if (j <= c)
                        {
                            c = Math.Ceiling(h / d + e);
                        }
                        else if (j > c)
                        {
                            c = Math.Ceiling(h / d - e);
                        }
                        if (c <= -0.5)
                        {
                            a = a - f * c;
                        }
    
                        double k = Math.Floor(h / d);
                        if (k <= g)
                        {
                            g = Math.Floor(h / d + e);
                        }
                        else if (k > g)
                        {
                            g = Math.Floor(h / d - e);
                        }
                        if (g > 0.5)
                        {
                            b = b + f * g;
                        }
                    }
    
                    bool result = (Math.Abs(e - a) > 0) ||
                                  (Math.Abs(f - b) > 0);
                });
                sw.Stop();
                long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
                Console.WriteLine(time);
                Console.WriteLine(sw.Elapsed.ToString());
                Console.Read();
            }
        }
    }
    

    结果:

    359930438
    Time Elapsed: 00:05:01.6560249
    

    差不多一分钟,好吧,这意味着无论你可以同时运行多少个线程,差异都是很小的。也许缓存(L1 或 L2)不足以容纳一些变量并强制更多 RAM 往返,或者答案可能不在您的处理器中,而是在您的代码中。

    【讨论】:

    • @javapowered 是的,首先检查你的代码没有问题,在目标系统上使用分析器运行。
    • 不是 c#er,但问题可能不是每个任务太小以至于大部分工作都花在了调度任务的开销上吗?如果您对工作进行不同的分区,例如在msdn.microsoft.com/en-us/library/dd560853.aspx 中,会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2019-01-26
    • 2013-10-08
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2018-05-22
    相关资源
    最近更新 更多