2

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

问题是两个处理器服务器的价格要贵 5 倍,但我的程序执行速度要慢 2 倍,请参阅我关于 stackoverflow线程池程序的问题在更快的服务器上运行速度要慢得多

我写了这个简单的程序来比较 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

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

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

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

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

4

2 回答 2

1

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

于 2012-06-19T17:05:31.650 回答
1

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

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

425872098
Time Elapsed: 00:05:56.9214226

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

所以我使用了并行任务库,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 往返,或者答案可能不在您的处理器中,而是在您的代码中。

于 2012-06-19T17:58:00.560 回答