1. データ

1. データ

Matlab でプログラムされた計算タスクがあります。これは、起動時にメモリに読み込まれる大量のデータの処理で構成されます。実行時間は数時間から数日の範囲です。タスクはシングルスレッドです。

このタスクを実行するために、私はさまざまな Linux マシンを自由に使用できます。これらのマシンは、すでに実行中のタスク (今後も当分の間実行され続ける) により、システム負荷が異なります。すべてのマシンは amd64 アーキテクチャを採用していますが、物理コアの数、仮想コアの数、クロック速度などの CPU モデルが異なります。

私の質問:タスクをできるだけ早く完了させることを目標として、タスクを実行するマシンの 1 つを選択するための原則的な方法はありますか?


以下の部分は Doktoro Reichard の回答に基づいて更新されました。

どのマシンが最も高速であるかを大まかに判断する方法として、次の 2 つの側面を組み合わせることが私の大まかな考えです。

(1) マシンが私のタスクを実行する場合に、その処理リソースのどのくらいの割合を割り当てるかを推定します。これを「相対速度」と呼びます。マシンがアイドル状態の場合、定義により、タスクは相対速度 1 で実行されます。現在の負荷が L でコア数が C の場合、タスクを送信すると負荷は L+1 になり、相対実行速度は R = min(C / (L+1), 1) になります。プロセスは 1 つ以上のコアを利用できないため、min 演算子が使用されます。 – この計算は、現在の負荷を与えられたマシンで可能な最適な速度と比較して、達成可能な処理速度の指標として正しいでしょうか。また、関連する数値 C は物理コアの数ですか、それとも仮想コアの数ですか。後者はハイパースレッディングにより 2 倍になります。

(2)マシンのパフォーマンス指標に基づいて、すべてのマシンがアイドル状態の場合に、各マシンでタスクが相対的にどのくらい速く実行されるかを推定します。これはクロック速度ではなく、適切に選択されたベンチマークである必要があります。

次に、(1)と(2)の積が最大となる機械を選択します。

答え1

主にコンピュータの動作方法のため、明確な答えはありませんが、何が最も速いかを判断する方法についていくつかのガイドラインを提供してみたいと思います。

あなたの発言を分析して、何が理解できて何が理解できないかをお伝えします。

1. データ

最初の段落で、すべてのデータをメモリにロードしてメモリから読み取ると述べられています。これは速度に有利です。帯域幅の点ではメモリに勝るものはありません。プログラムがディスク (HDD、SSD、ペンドライブのいずれであっても) を使用している場合、プログラムの実行速度のボトルネックになる可能性があります。

これは転送速度によるものです。RAM はプロセッサにほぼ直接アクセスします。ディスクは RAM よりもはるかに低い帯域幅の接続を通過する必要があり、HDD の場合は、データの取得と保存に必要な時間も考慮する必要があります。

2. OS

使用される OS は速度に多少影響を及ぼしますが、影響は小さいと考えられます。

3. プロセッサアーキテクチャ(または命令セット)

これは関連する側面です。マシンは amd64 プロセッサを使用していると述べられていますが、使用されている命令セットには若干の違いがある可能性があります。

例えば、オプテロンそしてそのセンプロンプロセッサのシリーズ。主な違いは、後者にはSSE3サポート。

SSE3 では、以前の命令セットでは効率の悪いプロセスを使用して実行されていたデータ (具体的には配列操作) を処理するための新しい、より効率的な方法が可能になります。

ですから、この点に関しては、新しいプロセッサは設計により高速化より効率的な命令セットをサポートしているためです。

4. システム負荷

これは、言い換えれば、決定打となるでしょう。各プログラムの動作を知らない限り、コンピューターの負荷を線形に計算することはできません。そうは言っても、10,000 個のプロセスが実行されていても負荷が残っている場合や、1 つのマルチスレッド プロセスがすべてのプロセッサ時間を浪費している場合があります。

しかし...これをさらに分析してみましょう。プロセスを追加するということは、プロセスが存在することと、そのプロセスのためにプロセッサの時間をどれだけ用意すべきかを知るために、基盤となるシステムに何らかのデータを追加することを意味します。この点では、プロセスが少ないより良い速度に関しては、カーネル/プロセッサが利用可能な時間の量をより適切に決定できるためです。

考慮すべきもう 1 つの点は、カーネルがプロセスに与える優先度です。優先度が最も高いプロセスは、プロセッサのほとんどの時間を占有します。

最終的には、プロセスに最大の優先度を与え、プロセスが停止するまで他のすべてのプロセスを永久に待機させるシステムを思いつくことができます。この場合、プロセス速度は CPU によって決まります。

5. CPU

コアと CPU クロック速度というポイントについて考えてみましょう。

カーネルが一部のプロセスを他のコアにシフトすることは考えられます。 制限的なケースでは、プロセスに 1 つのコア全体が割り当てられることがあります。 この点で、コアの数が増えると、より多くのプロセスを同時に実行できるようになります (その結果、より高速になります)。

私はマルチスレッドについてあまり詳しくないので、詳しい人に任せます。

クロック速度ではありませんプロセッサの効率性を明確に示す指標です。この根拠として、Apple ハードウェアにおける Intel プロセッサと PowerPC プロセッサの使用に関する「戦い」を紹介します。Apple は、Intel プロセッサのプロセッサ速度が向上しているにもかかわらず、PowerPC プロセッサを Intel よりも好む主な理由は、PowerPC の方が 1 秒あたりの処理数が多いため、パフォーマンスが優れているためだと主張しました。最終的に、Apple は電力問題やその他の経済的要因により Intel を選択しました。

失敗(浮動小数点演算/秒) は、特に浮動小数点演算を多用する科学計算の分野におけるコンピュータ パフォーマンスの指標で、1 秒あたりの命令数に似た、以前のより単純な数値です。作業がこのような演算に大きく依存している場合 (Matlab を使用している場合など)、クロック速度よりもこの数値の方が適している可能性があります。

しかし、それはあまり明らかにされていない量です(それはどんな実行している操作を確認します。いくつかのベンチマークを見つけましたオーバークロック.net私は次の2つを指摘します。

  • AMD フェノム Ix4 9850 @2.83GHzメモリ 754MHz 5-5-5-15GFLOPS:27.5
  • AMD フェノム IIx2 555 @4.12GHzメモリ 1000MHz 5-5-5-18ギガフロップス:26

ご覧のとおり、速度が 2 倍のプロセッサであっても、速度が半分のプロセッサよりもパフォーマンスが低下する可能性があります。

結論

明確な公式はないプログラムの処理には無数の要素が関係するため、実行時間を見積もるのに使えるルールがいくつかあります。私がまとめた経験則がいくつかあります(重要性):

  • すべての(または主に使用されている)データを RAM 上に置くと、速度が速くなります。(データ ストレージは、どのプロセスでも主なボトルネックになります)。
  • 同じマシンで実行されるプロセスが少ないほど、効果的です。
  • コアが多いほど良いです。
  • 新しいプロセッサは設計上より高速です。
  • CPU速度は粗い速度の指標(RAM のレイテンシやその他の要因が影響するため)
  • 機械にあなたのプロセスを最優先するよう指示することができます。機械はしようとしますプロセスにもっと時間を割り当てること。(私がしようとしますつまり、マシンにはプロセスにさらに時間を与える義務はなく、すべてをバランスさせようとします。これが 2 番目の項目が存在する理由です。

まだ完全な公式を出すのはちょっと躊躇しますが、非常におおよそコメントの出力に基づいて 1 つ。マルチスレッドについては説明できないので、すべてのコアが独立していると見なします。このデモでは、次のことを前提としています。

  • すべてのプロセスに同じ負荷がかかります。
  • プロセスは入力/出力を待機していません。
  • メモリ速度は想定される要因にはならない。
  • すべてのプロセスはシングルスレッドです。優先度は同じです。

この場合、ボトルネックとなるのは CPU の容量です。したがって、どの CPU でも、どのプロセスでも相対的な負荷は次のようになります。

R = min(C / N ; 1)

R は相対負荷、C は CPU のコア数、N はアクティブなプロセス数です。ただし、これはシステムがすべての負荷をコア全体に均等かつ完全に分散できることを前提としていますが、必ずしもそうとは限りません。

CPU の相対的な負荷に、選択した測定単位 (UM) (GHz または GFLOPS など) を掛けると、プロセスがどれだけ「高速」であるかの測定値が得られます。

Speed = R * UM

これであなたの式は正しいです。しかし、お願いします私が立てた仮定の数に注目してください。これは実際のケースとは程遠いものです。正確な量ではなく、推測

2番目のポイントは1番目と同じです(実際、質問の中で答えています)。要するに、マシンのパフォーマンス指標 ( R = 1) なので、ここでの疑問は、どのように選択するかということです。これは自分で分析する必要があります。GHz とコア数の積、GFLOPS、またはその 2 つの組み合わせを使用できます。

CPUのベンチマークを実行できるプログラム(最初の回答を書くときに思い出すべきだった)があり、そこから決定に役立つ値を得ることができます。私はSiSoftware Sandra(かなり古いバージョンですが、プロセッサ演算ベンチマークがあります)を持っていますが、他にもある

この場合、異なる測定単位を使用しない限り、1) と 2) を掛け合わせても違いは生じません。

関連情報