如何使用2 * Xeon E5的功率?

时间:2012-06-19 16:58:06

标签: c#

我有两台服务器,一台运行一台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是全新的英特尔处理器,我认为它应该比以前的E3-1220至少好一点,差不多便宜5倍。

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

所以Xeon E3和Xeon E5之间绝对没有区别。 E3的时钟频率提高了20%,因此工作速度提高了20%。我能做些什么,可能我会以某种方式使用一些特殊的Xeon E5指令?

令人讨厌的是,在真正的应用程序中,Xeon E5比Xeon E3慢2倍(!!)...(参考我的链接问题)

所以问题是 - 如何使用2 * Xeon E5配置的强大功能?我应该使用哪些技术,如何使用C#编程以使用多处理器配置的功能?

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

2 个答案:

答案 0 :(得分:1)

在我的一点经验中,任务并行库在创建正确数量的线程以最大化CPU方面做得非常出色。查看http://msdn.microsoft.com/en-us/library/dd537609.aspx

答案 1 :(得分:1)

首先:这个测试不是决定什么服务器是最好的($ 10 000或$ 1 500),因为在价格中包括几个东西,如材料的质量,电源,HD等。您的测试可以计算算术运算的数量(主要涉及处理器和内存总线)。

在我的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往返,或者答案可能不在您的处理器中,而在于代码