2

E3-1220 プロセッサを 1 つ実行するサーバーと、E5-2640 プロセッサを 2 つ実行するサーバーが 2 つあります。http://ark.intel.com/compare/52269,64591

問題は、5 倍高価な 2 プロセッサ サーバーが私のプログラムを 2 倍遅く実行することです

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 の特別な命令を何らかの方法で使用できますか?

そして、非常に厄介なのは、実際のアプリケーションでは、Xeon E5 が Xeon E3 よりも 2 倍 (!!) 遅いことです... (私のリンクされた質問を参照してください)

問題は、Xeon E5 構成の 2 倍力を使用するにはどうすればよいかということです。マルチプロセッサ構成の機能を使用するために C# でプログラミングする方法について、おそらくどのような手法を使用する必要がありますか?

私はちょうど $1500 で購入した既存のサーバーよりも私のプログラムを 2 倍遅く実行するサーバーを購入するために $10,000 を費やしたことにがっかりしました

4

2 に答える 2

1

まず第一に、このテストでは、どのサーバーが最適か ($10 000 または $1 500) を決定するものではありません。価格には、材料の品質、電源、HD などのいくつかの要素が含まれているためです。 test は算術演算の量を計算できます (これには主にプロセッサとメモリ バスが関係します)。

私の 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

ほぼ 1 分です。これは、同時に実行できるスレッドの数に関係なく、違いが小さいことを意味します。おそらく、キャッシュ (L1 または L2) がいくつかの変数を保持するのに不十分であり、より多くの RAM ラウンドトリップを強制するか、答えがプロセッサではなくコードにある可能性があります。

于 2012-06-19T17:58:00.560 に答える
1

私の少しの経験では、Task Parallel Library は適切な数のスレッドを作成して CPU を最大化するという素晴らしい仕事をしました。http://msdn.microsoft.com/en-us/library/dd537609.aspxをチェックしてください

于 2012-06-19T17:05:31.650 に答える