1つの大きなCPUコアを作成してみませんか?[閉まっている]


25

CPUメーカーがマルチコアチップを製造する理由がわかりません。複数のコアのスケーリングは恐ろしく、これは非常にアプリケーション固有であり、多くのコアで優れた動作をする特定のプログラムまたはコードを指摘できると確信していますが、ほとんどの場合、スケーリングは不要です。これは、シリコンダイスペースの無駄とエネルギーの無駄です。

たとえば、ゲームでは、4つ以上のコアを使用することはほとんどありません。AnsysやFluentなどの科学およびエンジニアリングシミュレーションは、実行するPCのコア数に応じて価格が設定されるため、より多くのコアがあるため、より多くの費用を支払う必要がありますが、16コアを超えるとより多くのコアのメリットが非常に少なくなりますが、これらの64コアがありますワークステーション...それはお金とエネルギーの無駄です。冬には1500 Wのヒーターを購入する方がはるかに安価です。

1つの大きなコアだけでCPUを作成しないのはなぜですか?

8コアCPUと同等の1コアを作成した場合、1コアでIPCが800%増加するため、複数のコアに最適化されたプログラムだけでなく、すべてのプログラムで完全なパフォーマンスが得られると思います。IPCを増やすとどこでもパフォーマンスが向上し、信頼性が高くシンプルな方法でパフォーマンスを向上できます。複数のコアは、限られた数のプログラムでのみパフォーマンスを向上させ、スケーリングは恐ろしく信頼性が低くなります。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました。到達した結論は、質問および/または回答に編集して戻す必要があります。
デイブツイード

この記事に興味があるかもしれません:gotw.ca/publications/concurrency-ddj.htm
lvella

「しかし、より多くのコアの利点は、過去16コアよりも非常に貧弱になります」あなたは明らかにあなたが何について話しているのか分からない。私を信じて、私は数万のCPUで実行されるプロセスに取り組んできました。「Embarrassingly parallelisable」と呼ばれる問題のクラス全体があり、問題にさらにコアを投げることが非常にうまく機能します。
アロン

回答:


93

問題は、CPU製造者がトランジスタを追加するだけで、単一のCPUコアをより強力にすることができるという前提にあります。

CPUの処理量を増やすには、実行する処理の計画を立てる必要があります。本当に3つのオプションがあります:

  1. コアをより高いクロック周波数で実行します -これに関する問題は、私たちができることの限界にすでに達していることです。

    電力消費、したがって熱放散は周波数とともに増加します-周波数を2倍にすると、通常は消費電力が2倍になります。電圧を上げると、電力損失は電圧の2乗に比例して増加します。

    相互接続とトランジスタも、世界の理想的ではない性質のために伝播遅延があります。トランジスタの数を増やすだけで、同じクロック周波数で実行できると期待することはできません。

    また、外部ハードウェア(主にRAM)によって制限されます。CPUを高速化するには、メモリ帯域幅を増やすか、高速で実行するか、データバス幅を大きくする必要があります。


  1. より複雑な命令を追加 -より高速に実行する代わりに、より豊富な命令セットを追加できます-暗号化などの一般的なタスクをシリコンに強化できます。ソフトウェアで計算するのに多くのクロックサイクルを費やすのではなく、代わりにハードウェアアクセラレーションを使用します。

    これは、すでにComplex Instruction Set(CISC)プロセッサで実行されています。SSE2、SSE3などを参照してください。現在、単一のCPUコアは、同じクロック周波数で動作していても、10年前のCPUコアよりもはるかに強力です。

    問題は、より複雑な命令を追加すると、より複雑になり、チップが大きくなることです。直接的な結果として、CPUの速度が低下します。伝搬遅延が増加すると、達成可能なクロック周波数は低下します。

    これらの複雑な手順は、単純なタスクの助けにもなりません。考えられるすべてのユースケースを強化することはできないため、実行中のソフトウェアの大部分は、新しい命令の恩恵を受けることは避けられず、実際には、結果として生じるクロックレートの低下によって損なわれます。

    データバス幅を大きくして、一度により多くのデータを処理することもできますが、この場合もCPUが大きくなり、より大きなデータバスで得られるスループットとクロックレートの低下のトレードオフになります。小さなデータ(32ビット整数など)しか持っていない場合、256ビットCPUを使用しても実際には役立ちません。


  1. CPUの並列性を向上させる-1つの処理を高速化するのではなく、複数の処理を同時に実行します。実行中のタスクが一度にいくつかのことを実行するのに役立つ場合、命令ごとに複数の計算を実行できる単一のCPU(単一命令複数データ(SIMD))、またはそれぞれが1つを実行できる複数のCPUが必要です計算。

    これは、マルチコアCPUの主要なドライバーの1つです。複数のプログラムを実行している場合、または単一のプログラムを複数のタスクに分割できる場合、複数のCPUコアを使用すると、より多くのことを一度に実行できます。

    個々のCPUコアは事実上別個のブロックであるため(キャッシュとメモリインターフェイスを除く)、個々のコアは同等の単一モノリシックコアより小さくなります。コアはよりコンパクトであるため、伝搬遅延が減少し、各コアをより高速に実行できます。

    単一のプログラムが複数のコアを持つことで利益を得ることができるかどうかについては、それはそのプログラムが何をしていて、どのように書かれているかに完全に依存しています。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました。到達した結論は、質問および/または回答に編集して戻す必要があります。
デイブツイード

まだ対処されていないコメントで指摘されたポイントの1つは、クロックごとに複数の命令を実行することでCPUを並列化できることです(スーパースカラー)。これは、SIMDと周波数に直交しています。クロックあたりの命令(IPC)は、時間あたりの実際のスループットの3番目の要因です。対話型ワークロード用の最新のCPUはすべて、少なくとも2ワイドです。
ピーターコーデス


37

他の答えに加えて、別の要素があります:チップ歩留まり。最新のプロセッサには数十億個のトランジスタが搭載されており、チップ全体が適切に機能するためには、これらのトランジスタのそれぞれが完全に動作する必要があります。

マルチコアプロセッサを作成することにより、トランジスタのグループをきれいに分割できます。コアの1つに欠陥が存在する場合、そのコアを無効にして、機能しているコアの数に応じてチップを割引価格で販売できます。同様に、SMPシステムのように、検証済みのコンポーネントからシステムを組み立てることもできます。

購入するほぼすべてのCPUについて、そのプロセッサラインの最上位のプレミアムモデルになることが始まりました。最終的には、そのチップのどの部分が正しく機能せず無効になっているかによって異なります。Intelはi3プロセッサーを製造していません。これらはすべてi7に欠陥があり、テストに失敗したために製品ラインを分離するすべての機能が無効になっています。ただし、まだ機能している部分は依然として有用であり、はるかに安く販売できます。さらに悪いことは、キーチェーンの装身具になります。

そして、欠陥は珍しくありません。数十億個のトランジスタを完全に作成するのは簡単なことではありません。特定のチップの一部を選択的に使用する機会がない場合、結果の価格は急速に上昇します。

単一のüberプロセッサだけで、製造はすべてかゼロになり、結果としてはるかに無駄なプロセスになります。科学や軍事用のイメージセンサーのように、巨大なセンサーが必要であり、すべて動作する必要がある一部のデバイスの場合、それらのデバイスのコストは莫大であり、州レベルの予算だけで十分です。


4
歩留まりが改善し、市場が要求するよりも完全に機能するチップを生産している場合、ベンダーは通常、価格構造を調整して高価格を実現する代わりに、一部のコア/キャッシュの融合と低頻度SKUでのビニングを開始します。チップは比較的安価です。GPU /グラフィックスカードを使用すると、ファームウェアハックで一部のカードの無効なシェーダーユニットのロックを解除できるようになりました。実際の欠陥ではなく、市場セグメンテーションのみで無効になったカードが幸運であるかどうかを確認します。
ピーターコーデス

4
Intelは、一部のチップ向けにデュアルコアダイを製造しています。ULV(超低電圧)モバイルSKUはすべてデュアルコアであるため、クアッドコアの欠陥は十分ではなく、ダイ面積が小さいため(特にカットダウンiGPUを使用した場合)、ウエハーあたりの稼働中のデュアルコアチップが増えますクアッドコアのダイを溶かすよりも。 en.wikichip.org/wiki/intel/microarchitectures/…には、Sandybridgeのダイショット131mm²ダイサイズデュアルコア+ GT1グラフィックがあります。これに対して、149mm²デュアルコア+ GT2グラフィック+ 216mm²クワッド+ GT2です。キャッシュなどの欠陥のために余地はまだあります
ピーター・コルド

また、FMAユニットの一部の(一部の)欠陥は、おそらくそれを融合させてCeleronまたはPentiumチップ(AVXなし、128ビットベクターのみ)として販売することで処理できます。最新のSkylakeまたはCoffee Lake PentiumチップでさえAVXを欠いています。SIMD FMAユニットは、コアのかなりの部分を構成します(そして、整数演算や整数シフトを含む、FP数学以外の多くのSIMD演算を実行します)ので、2x 256ビットFMAユニットをマッピングできても驚かないでしょうまだ動作している2つのチャンクを使用する2x 128ビット。Skylake Xeonでは、AVX512 FMAスループットが低下したSKUもあります(512ビットFMAが動作するのは1つのみ)
Peter Cordes

@PeterCordes歩留まりが良好な場合、ベンダーは、欠陥率がコアを無効にしたり、チップをアンダークロックしたりできる場所に戻るまで、高密度および/または高速クロックレート(したがって、より高い欠陥率)設計を引き出します。割引価格で販売する...
モンティ・ハーダー

@MontyHarder:それは一種の真実ですが、検証には費用と時間がかかり、既存の生産ラインはしばらくの間既存のデザインを作り続けます。しかし、はい、あなたが話していることのいくつかのIntelの例は、Haswell Refresh、および基本的にアーキテクチャの変更と14nmプロセスへのマイナーな改善を伴わないSkylakeのさまざまな改良です。(時々、新しいiGPUで)。たとえば、Intelの通常のティッククロックリズムの「最適化」ステップとしてのKaby Lake、Coffee Lakeなど。
ピーターコーデス

26

データ依存

チップを「広く」することにより、クロックごとに命令を追加するのはかなり簡単です-これは「SIMD」アプローチです。問題は、これがほとんどのユースケースに役立たないことです。

ワークロードには、独立型と依存型の2種類があります。独立したワークロードの例としては、「数字A1、A2、A3 ...、B1、B2、...などの2つのシーケンスを与え、(A1 + B1)および(A2 + B2)などを計算する」などがあります。この種のワークロードは、コンピューターグラフィックス、オーディオ処理、機械学習などで見られます。これのかなり多くがGPUに与えられており、GPUは特にそれを処理するように設計されています。

依存するワークロードは、「与えられたAに5を加えてテーブルで調べます。結果を取得して16を加えます。別のテーブルで調べます」です。

独立したワークロードの利点は、多くの異なる部分に分割できるため、より多くのトランジスタが役立つことです。依存するワークロードの場合、これはまったく役に立ちません-トランジスタを増やすと遅くなります。メモリから値を取得する必要がある場合は、速度が低下します。信号はマザーボード全体に送信され、サブライト速度で移動し、DRAMは行を充電して結果を待機し、最後に送信する必要があります。これには数十ナノ秒かかります。次に、簡単な計算を行ったら、次の計算のために送信する必要があります。

パワー管理

スペアコアはほとんどの場合オフになります。実際、非常に多くのプロセッサで、すべてのコアを常に実行することはできません。そのため、システムはそれらをオフにするかダウンクロックします。

ソフトウェアを書き直すことが前進する唯一の方法です

ハードウェアは、依存するワークロードを自動的に独立したワークロードに変換することはできません。ソフトウェアもできません。しかし、多くのコアを活用するためにシステムを再設計する準備をしているプログラマは、まさにそうかもしれません。


2
「すべてのコアを同時に実行できない」ために必要な引用。シングルコアの最大ターボクロック速度をCPUの「実際の」クロック速度と見なさない限り。古典的な意味では(パワーウォールに到達する前に、クロック速度はクリティカルパス伝搬遅延によって制限されていました)、はい、それは事実ですが、現代の世界では、ベースラインクロック速度をすべてで維持できるものとして見るのがより理にかなっています重いワークロードを実行するアクティブなコア。それよりも高いものは、電力/熱の制限が許す限り日和見的に使用できる肉汁です。(たとえば、IntelのTurbo)。
ピーターコーデス

1
しかし、電力に関しては、シングルコアの最大クロックでさえ、伝播遅延よりもサーマルによって制限されます(ただし、パイプラインステージの境界が選択されるため、ターゲットの最大ターボでその制限に近くなります)。また、電圧も変数です。電力は低下しますが、ゲート遅延は短くなります。とにかく、シングルコアの最大ターボをすべてのコアを「実行」できるものと見なすのは意味がありません。その限界はすでに電力に由来しているからです。
ピーターコーデス

元の質問のコンテキストは、シングルコアの最大速度について間違いなく尋ねていましたが、多くの実用的な目的(およびそのキャッシュミス)が、ユーザーに認識される速度の本当の制限要因です。
pjc50

はい、できれば8コアCPUではなく、8倍のシングルスレッドパフォーマンスを使用します。(SMTを使用すると、コンテキストスイッチのオーバーヘッドなしで自然に分離したワークロードを実行できます。私の答えを参照してください。)仮想ワークロードのコアは、ワークロードがすべてのストールを引き起こした場合、 SIMD FMAユニットのトランジスタが起動し、すべてのクロックが切り替わります。(シングルコアのパワーゲーティングも、高クロックで溶けないための鍵です。en.wikipedia.org / wiki / Dark_silicon)。したがって、単一のワイドコアを使用しても、これは変わりません。
ピーターコーデス

現在のCPUで見られるシングルスレッドのパフォーマンスは、最悪のワークロードでもすべてのコアで同時に維持できるクロック速度に制限されている場合よりも優れているという点があります。つまり、特にラップトップチップなどの低TDPパーツの場合、ターボが重要です(なぜHPCでCPUがピークパフォーマンスを維持できないのか):通常、高出力だがコア数の少ないデスクトップチップとは異なり、ベースラインと最大ターボの比率が大きいたとえば、i7-6700k Skylakeは4GHzベース、4.2GHzシングルコアターボです(オーバークロックなし。95WTDPでより高い可能性があります)。
ピーターコーデス

20

過去にさかのぼると、プロセッサはその速度で実行できませんでした。その結果、より多くの処理を行いたい場合は、より多くのプロセッサが必要になります。これは、数学コプロセッサーを使用することも、同じプロセッサーを単に使用することもできます。これの最良の例は、80年代のInmos Transputerです。これは、複数のプロセッサが接続された超並列処理用に特別に設計されました。全体のコンセプトは、プロセッサを追加するよりも処理能力を向上させる良い方法はないとの仮定にかかっていました。

問題は、その仮定が(一時的に)間違っていたことです。また、1つのプロセッサでより多くの計算を行うことで、処理能力を高めることもできます。IntelとAMDは、クロック速度をさらに高速化する方法を見つけました。あなたが言うように、すべてを1つのプロセッサに保持する方が簡単です。その結果、2000年代半ばまで、高速シングルコアプロセッサが市場を所有していました。Inmosは90年代初頭に死亡し、彼らの経験はすべて彼らと共に死にました。

しかし、良い時代は終わらなければなりませんでした。クロック速度がGHzに達すると、それ以上進むことができませんでした。そして、再び複数のコアに行きました。本当に速くならない場合、より多くのコアが答えです。ただし、あなたが言うように、これらのコアを効果的に使用することは必ずしも簡単ではありません。最近はかなり良くなっていますが、トランスピュータと同じくらい簡単にできるようになっています。

もちろん、改善のための他のオプションもあります-代わりに、より効率的にすることができます。SIMDおよび同様の命令セットは、同じ数のクロックティックに対してより多くの処理を実行します。DDRを使用すると、データをより速くプロセッサに出し入れできます。それはすべて役立ちます。しかし、処理に関しては、80年代とマルチコアに戻りました。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました。到達した結論は、質問および/または回答に編集して戻す必要があります。
デイブツイード

20

良い質問か、興味深い回答が少なくとも1つあります。この回答の一部は、CPU 複数の独立したコアではなく、幅を効率的に拡張できる世界をイメージしています。ライセンス/価格モデルは異なります!

残りは、なぜできないのかを説明しています。概要:

  • 複数のコアのコストはほぼ線形にスケーリングします
  • 1コアのスーパースカラーパイプラインを拡張するコストは、約2 倍に拡大します。これは、とにかくある程度まで、十分なブルートフォースで実行可能です。シングルスレッドのパフォーマンスは、インタラクティブな使用にとって非常に重要です(スループットだけでなく、エンドツーエンドのレイテンシが問題になります)。そのため、現在のビッグコアハイエンドCPUはその代価を支払います。例:Skylake(4ワイド)、Ryzen(5または6ワイド)、およびAppleのA12(大きなコアでは7ワイド、小さなエネルギー効率の良いコアでは3ワイド)
  • パイプラインを3または4幅以上に拡張するだけでILPを見つけるための順序が正しくない場合でも、深刻なIPCの減少は戻ります。ブランチミスとキャッシュミスは困難であり、パイプライン全体を停止させます。
  • 周波数については言及しませんでしたが、IPCだけですが、周波数のスケーリングも難しいです。高い周波数は、より高い電圧を必要とするので、周波数のパワースケールは立方^1直接周波数から、および^2電圧から。(コンデンサに蓄積されたエネルギーはV ^ 2に比例し、漏れ電流を超えるほとんどの動的電力は、FETゲート+ワイヤの容量性負荷への電荷のポンピングによるものです。)

    パフォーマンス= IPCの頻度。(同じアーキテクチャ内で。より広いSIMDでは、より少ない命令で同じ作業を行うことができます。一部のISAは他のISAよりも密度が高くなります。

コストは、ダイ領域(製造コスト)および/または電力(冷却が難しいため間接的に周波数を制限する)にあります。また、特にモバイル(バッテリー)およびサーバー(電力密度/冷却コスト/電力コスト)の場合、ワットあたりの電力とパフォーマンスの低下自体が目標です。

ソケットごとのマルチコアが問題になる前は、製造可能な単一のCPUで達成可能なスループットよりも高いスループットが必要なハイエンドユースケース向けのマルチソケットシステムがあり、それが唯一のSMPシステムでした。(サーバー、ハイエンドワークステーション)。

単一のコアが希望どおりに効率的に拡張できる場合、ソケットごとに1つの物理コアを持つシステムがあります。 、複数の論理コアとして機能するSMT(ハイパースレッディングなど)を。 典型的なデスクトップ/ラップトップには物理コアが1つしかなく、より多くのコアで線形にスケーリングしないものを並列化するのに苦労しません。たとえばmake -j4、マルチソケットサーバーを活用したり、デスクトップでI / Oレイテンシを隠したりします。(または、パイプラインの幅が簡単にスケーリングされたがIPCがそうでなかった場合、まだ多くの並列化を試みるかもしれません。そのため、より多くのSMTスレッドを使用する必要がありました。) OSへのSMTの提示は非常に異なっていたため、そこでは並列スケジューリングアルゴリズムとロックが必要になります。


ドナルド・クヌースは2008年のインタビューでこう語った

マルチコアアーキテクチャへの現在の傾向に個人的に不満があることについても、少し炎上するかもしれません。私には、ハードウェア設計者がアイデアを使い果たしてしまったように見え、ムーアの法則の将来の終forの責任をソフトウェア作家に渡そうとしているように見えますが、少数のマシンでのみ高速に動作するマシンを提供することで重要なベンチマーク!

はい、8倍のスループットの奇跡的なシングルコアCPUがあれば 実際のプログラム、おそらくそれらを使用しているでしょう。デュアルソケットシステムでは、スループットを高めるために多くを支払う価値があった場合にのみ(シングルスレッドパフォーマンスではありません)。

複数のCPUを使用すると、複数のプログラムを高速で切り替えるのではなく、実際に並列に実行できるため、コンテキスト切り替えのコストが削減されます このようなCPUが必要とする大規模な異常な機械を中断するプリエンプティブマルチタスクは、おそらく現在よりもさらに痛いでしょう。

物理的にはシングルコア(コア間の相互接続のない単純なキャッシュ階層の場合)ですが、SMT(Intelのハイパースレッディングなど)をサポートするため、ソフトウェアはスループットリソースを動的に競合する8つの論理コアとして使用できます。または、1つのスレッドのみが実行されている/ストールされていない場合、完全なメリットが得られます。

そのため、実際に簡単で自然な場合(たとえば、個別のプロセスを一度に実行する場合)、またはこの獣のIPCを使い果たすことを妨げる依存関係チェーンで簡単に並列化できる場合は、複数のスレッドを使用します。

しかし、残念なことに、マルチコアCPUはこの時点で停止するというKnuth側の希望的観測です。


シングルスレッドパフォーマンススケーリング

8コアCPUと同等の1コアを作成した場合、1コアでIPCが800%増加するため、複数のコアに最適化されたプログラムだけでなく、すべてのプログラムで完全なパフォーマンスが得られると思います。

はい、そうです。 そのようなCPUをまったく構築することができれば、それは非常に驚くべきことです。しかし、私はそれが文字通りだと思います、同じ半導体製造プロセスでは不可能ます(つまり、トランジスタの品質/効率は同じです)。8コアCPUと同じ電力バジェットとダイ領域では、コアを結合するためのロジックを節約し、コアごとのプライベートキャッシュにそれほど多くのスペースを必要としませんが、確かに不可能です。

周波数の増加を許可したとしても(実際の基準は1秒あたりの動作であり、1クロックあたりの動作ではないため)、CPUを2倍高速化することは大きな課題です。

同じ電力とダイ領域の予算(製造コスト)に近い場所そのようなCPUを構築することが可能である場合、はいCPUベンダーはすでにそのように構築しています。

最新のマイクロプロセッサ90分ガイドをご覧ください

具体的には、より多くのコアまたはより広いコアですか?セクション、この答えを理解するために必要な背景について; 順番に並べられたパイプライン化されたCPUの動作から始まり、スーパースカラー(クロックごとに複数の命令)になります。次に、P4時代にパワーウォールに到達し、簡単な周波数スケーリングの終わりに至り、ほとんどIPCのみを残し、より小さなトランジスタでも、命令(SIMDなど)ごとに多くの作業を行う方法について説明します。

パイプラインを広くする(クロックあたりの最大命令数)と、通常、コストはwidth-squaredに比例します。そのコストは、より広い並列依存関係チェック(ハザード検出)および実行する準備ができた命令を見つけるためのより広い順序外スケジューラーのために、ダイ領域および/または電力で測定されます。また、以外の命令を実行する場合は、レジスタファイルとキャッシュの読み取り/書き込みポートを増やしてくださいnop。特に、FMAやキャリー付き加算(2レジスタ+フラグ)などの3入力命令がある場合。

また、CPUをより広くするためのIPCリターンが減少しています。ほとんどのワークロードでは、CPUが活用する小規模/短距離ILP(命令レベルの並列処理)が制限されているため、IPCが既に幅の制限に制限されている場合、コアを広くしても IPC(クロックあたりの命令)増加しません依存関係チェーン、ブランチミス、キャッシュミス、またはその他のストールによるコア。独立した反復で展開されたループでスピードアップが得られることは確かですが、ほとんどのコードがほとんどの時間を費やしているわけではありません。比較/分岐命令は、「典型的な」コードであるIIRCの命令ミックスの20%を構成します。(私はさまざまなデータセットの15〜25%の数値を読んだと思います。)

また、依存するすべての命令(およびROB容量に達するとすべてのもの)がストールするキャッシュミスは、CPUが広いほどコストが高くなります。(より多くの実行ユニットをアイドル状態にする機会費用。より多くの潜在的な作業が完了しない。)または、分岐ミスも同様にバブルを引き起こします。

IPCを8倍にするためには、分岐予測の精度とキャッシュヒット率を少なくとも8倍改善する必要があります。ただし、キャッシュヒット率は、ほとんどのワークロードで特定のポイントを超えるキャッシュ容量にうまく対応できません。そして、HWプリフェッチは、スマートですが、することができないというスマート。また、IPCの8倍では、分岐予測子はサイクルごとに8倍の予測を生成し、より正確にする必要があります。


順不同の実行CPUを構築する現在の手法では、短距離でのみILPを見つけることができます。たとえば、SkylakeのROBサイズは224融合ドメインuopであり、実行されていないuopのスケジューラは97非融合ドメインです。参照長さを増大させるために、二つの長依存鎖でループ上LFENCEの影響を理解する彼らが得る場合、スケジューラサイズは、命令の2本の長い鎖からILPを抽出する際の制限要因である場合のためにあまりにも長いです。および/またはこのより一般的で入門的な回答を参照してください)。

したがって、2つの別々の長いループ間でILPを見つけることは、ハードウェアでできることではありません。ループフュージョンの動的なバイナリ再コンパイルが可能な場合もありますが、Transmeta Crusoeルートに行かない限り、CPUが実際に実行できることは難しく、ハードではありません。(異なる内部ISA上のx86エミュレーション層。この場合はVLIW)。しかし、uopキャッシュ強力なデコーダーを備えた標準的な最新のx86設計は、ほとんどのコードに勝るものはありません。

また、x86以外では、まだ使用されているすべてのISAは比較的簡単にデコードできるため、長距離の最適化以外に動的再コンパイルの動機はありません。 TL:DR:より多くのILPをハードウェアに公開できるマジックコンパイラを期待しても、Itanium IA-64ではうまくいきませんでした。また、実行のシリアルモデルを備えた既存のISAのスーパーワイドCPUでは動作しません。


超ワイドCPUを使用していた場合は、SMTをサポートして、複数の低ILPスレッドを実行することで実行する作業を維持できるようにする必要があります。

Skylakeの幅は現在4 uopsである(そして、クロックあたり2〜3 uopsの実際のIPC、またはハイスループットコードで4に近い)ので、8倍の仮想CPUは32幅になります!

それを動的に切り替わる8個または16個の論理CPUに戻すことができるそれらを実行リソース共有ことができれば素晴らしいです。ストールされていないスレッドはすべてのフロントエンド帯域幅とバックエンドスループットを取得します。

ただし、8つの独立したコアを使用すると、スレッドがストールした場合、実行ユニットにフィードを保持することはできません。他のスレッドにはメリットがありません。

多くの場合、実行はバースト的です。キャッシュミスのロードを待機して停止し、一度到着すると、多数の命令が並行してその結果を使用できます。超ワイドCPUを使用すると、そのバーストはより高速になり、実際にSMTに役立ちます。


しかし、魔法のような超ワイドなCPUを持つことはできません

そのため、スループットを得るために、スレッドレベルの並列処理という形で並列処理をハードウェアに公開する必要があります。一般に、コンパイラは、非常に大きなループのような単純な場合を除いて、いつ/どのようにスレッドを使用するかを知るのに優れていません。(OpenMP、またはgccの-ftree-parallelize-loops)。スレッド間の通信は高価であり、スレッドの起動も同様であるため、有用な作業を効率的に並列に実行するには、コードを修正するのに人間の賢さが必要です。

TLPは、HWが活用できる実行の単一スレッド内の細粒度ILPとは異なり、粗粒度並列処理です。


対話型のワークロード(Intel / AMD x86、Apple / ARM AArch64ハイエンドコアなど)を対象としたCPU は、IPCスケーリングの利益の減少を確実に推進します。超並列問題。

ゲームの8つのコピーをそれぞれ15fpsで並行して実行できることは、45fpsで1つのコピーを実行できることよりもはるかに価値がありません。CPUベンダーはこれを知っているので、最新のCPUはかなりの電力とダイ領域を必要としますが、アウトオブオーダー実行を使用します。(ただし、GPUは、ワークロードが既に超並列であるため、そうではありません)。

IntelのメニーコアXeon Phiハードウェア(Knight's Landing / Knight's Mill)は興味深い中間点です:非常に限られたアウトオブオーダー実行とSMTにより、2ワイドコアにAVX512 SIMD命令を供給して数値を処理します。コアは、Intelの低電力Silvermontアーキテクチャに基づいています。(アウトオブオーダーexecですが、小さなコアのSandybridgeファミリーよりもはるかに小さい小さな並べ替えウィンドウがあります。パイプラインが狭くなっています。)


ところで、これはすべてSIMDに直交しています。問題が発生する可能性がある場合は、命令ごとにより多くの作業を行うことが常に役立ちます。


価格モデル

ソフトウェア価格モデルは、現在のハードウェアの状況に基づいています。

マルチコアCPUの登場により、コアごとのライセンスモデルがより普及しました(シングルソケットデスクトップにも関連するようになりました)。それ以前は、サーバーと大きなワークステーションにのみ関連していました。

ソフトウェアが最高速度で実行するために複数のコアを必要としなかった場合、弱いCPUで実行するため、それほど利益を得ていない人々に安く販売する方法はありません。ソフトウェア/ハードウェアエコシステムが「SMTチャネル」の制御を進化させて、その論理コアで実行されるコードの最大実行幅を構成できるのでない限り。(CPUが複数の独立したコアではなくパイプライン幅でスケーリングする世界を想像してください。)


2
「スレッドの起動は高価です」-それは難しい事実ではありません。一般的な最新のオペレーティングシステムのアーティファクトです。
MSalters

1
@MSaltersそして実際、いくつかの研究プロジェクトは、このアプローチをやめることがどれほど素晴らしいかを調査しました。「コードを手直しする人間の賢さ」と同じ-並列化が自然に簡単なコードを書く方法がありますが、過去数十年ではあまり人気がありませんでした。それら使用される場所で、通常、非常に低コストで大規模な水平スケーリングを見ることができます。実際、多くのアプリケーションで水平方向のスケーリングが垂直方向よりもはるかに安価になり始めています。開発者に選択肢を与えてはならないことを意味します-状況がそれを強制する場合、それはうまく動作します:D
Luaan

11

類推をさせてください:

タイプライターでタイピングする猿がいて、もっとタイピングをしたい場合は、猿にコーヒーを与え、タイピングのレッスンを行い、恐らくそれをより速く動作させるための脅威を与えることができますが、猿は最大容量で入力します。

したがって、さらに入力を行いたい場合は、さらにサルを取得する必要があります。


類推をさらに拡張するには、各サルに個別のタイプライター(各コアが必要とするデータバスを表す)が必要です。各サルにバナナを入れる方法と、それらの糞を拾うための何か(電力分布と熱に類似)が必要です。そして、あなたはサルがすべて12番目の夜に同じパッセージをタイプしようとしているのではないことを保証する方法が必要です(プロセッサ間でワークロードを正しく分割することに似ています)。しかし、これらすべては、1匹のサルからより多くのタイピングを取得しようとするよりも、より多くの利益を得るための作業ではありません。


7

多くのソフトウェアは(x)コア以上を使用しないことを指摘します。しかし、これは完全にそのソフトウェアの設計者による制限です。複数のコアを備えたホームPCはまだ新しいものであり、マルチスレッドソフトウェアの設計も従来のAPIと言語では困難です。

お使いのPCもその1つのプログラムを実行しているだけではありません。あまりアクティブでないコアに配置できる他のすべてのことを行っているので、プライマリソフトウェアがそれらによってそれほど中断されません。

現在のところ、8コアのスループットに合わせてシングルコアの速度を上げることはできません。新しいアーキテクチャからより多くの速度が必要になる可能性があります。

より多くのコアが一般的に利用可能であり、APIがその前提で設計されているため、プログラマーは一般により多くのコアを使用し始めます。マルチスレッド設計をより簡単にするための取り組みが進行中です。数年以内にこの質問をした場合、「私のゲームは一般的に32コアしか使用しないのに、なぜCPUに256コアがあるのですか?」と言うでしょう。


3
複数のコア対1の違いはある巨大な利点を活用するためのソフトウェアを取得するという点で。ほとんどのアルゴリズムとプログラムはシリアルです。例えばドナルド・クヌースは述べている HWデザイナーなどのマルチコアCPUの外観をしていることを「私たちのマシンを与えることによって、ソフトウェアの作者にムーアの法則の将来の終焉のための責任を渡そうとしているより速く、わずか数キーベンチマークの仕事!
ピーター・コルド

残念ながら、複数のコアで効率的に並列コードを実行できるほど高速で、単一のワイド/高速コアでシングルスレッドプログラムを実行する方法を考え出す人はいません。しかし幸いなことに、CPU設計者は、シングルスレッドのパフォーマンスが依然として重要であることを認識しており、個々のコアを並列問題で純粋なスループットを実現する場合よりもはるかに大きく強力にしています。(Skylake(4ワイド)またはRyzen(5ワイド)とXeon Phi(Silvermont + AVX512に基づいたKnight's Mill)のコアとの比較(2ワイドおよび限定OoOエグゼクティブ)
Peter Cordes

2
とにかく、少なくとも2つのコアを持つことはマルチタスクOSに役立ちますが、現在のCPUの4倍または8倍の速度のシングルコアでのプリエンプティブマルチタスクはかなり良いでしょう。同じパワーバジェットで/まったく構築することができれば、はるかに優れたインタラクティブなユースケースの多くに対して。(ただし、複数のタスクがCPU時間を必要とする場合、デュアルコアはコンテキストスイッチのコストを削減します。)
Peter Cordes

1
すべて真実ですが、歴史的にマルチコアはより高価でした。科学アプリケーション以外で並列アルゴリズムを設計する理由はあまりありませんでした。ほとんどシリアルで実行する必要があるアルゴリズムであっても、並列化の余地はたくさんあります。しかし、現世代のIPCは素晴らしいものではなく、簡単に台無しになります。これは一般に、発見および修正が非常に難しいバグをもたらします。もちろん、4倍高速なCPUは驚くべきものです(ただし、複数のコアが必要です)。
ヘケテ

2
@PeterCordesまあ、ほとんどのアルゴリズムとプログラムはそうである必要があるためシリアルではありませんが、ほとんどの場合それが常に行われている方法だからです(「それは良いトレードオフでした」)。最もひどいケースは、4つの別々のワークロードで同じプログラムを4回実行し、問題なく並行して実行できる場合です。しかし、それは別の問題にぶつかります-CPUはそれほど頻繁にボトルネックではありません。通常は、CPUを増やすのではなく、より良いアルゴリズムを使用する方法です。他のボトルネック(メモリ、ディスク、ネットワークなど)でも役立つ場合があります。
ルアーン

3

歴史的な観点から最も説得力のある理由は、消費電力です。

Pentium IVの後、Intelは、4 GHz〜12 GHzの範囲で動作するはずのTejasというコード名の次世代プロセッサを追求しようとしました。問題は、その速度で実行すると発熱しすぎて実行できないことでした。

Tejasがキャンセルされた後、Intelは許容できるレベルの熱で4 GHzで動作するコアを最終的に持つまでに、さらに10〜15年かかりました。

見る TejasとJayhawkを

Intelには、Tejasと並行して、複数のコアの使用を伴う別のプロジェクトがありました。そのプロジェクトは許容可能なレベルの熱を持っていたので、それは彼らが行った方法です。これにより、10 nmの製造プロセスをさらに10年待つことなく、パフォーマンスを向上させることができました。

コアのリソースが不足していないと仮定すると、Nコアではなく1コアから毎秒同じ数の命令を取得するには、そのシングルコアの命令レートがN倍速くなる必要があります。CPUコアの動的消費電力は、動作周波数に直線的に比例します。また、動作電圧の二乗に比例します。より低い周波数で動作すると、より低い動作電圧を使用できます。より低い周波数でより低い電圧を使用するということは、実際に発生する熱は立方体で下がることを意味しますは動作周波数のします。

これの極端な例は、わずか20 Wの電力で毎秒2 ^ 18回の操作に相当する人間の脳です。これは、わずか数百Hzで並列に実行される数十億のニューロンを使用することでこれを実現します。

また、PC上では通常、数百または数千のスレッドが同時に実行されていることに注意してください。オペレーティングシステムは、各スレッドへのコア上の時間の割り当てを処理します。そのため、個々のプログラムがすべてのコアを利用していなくても、他のプログラムが別のコアで実行されている場合、CPU時間の消費が少ないため、依然として利点があります。

どちらかといえば、高性能市場はFPGAの形でより並列処理に移行しています。Intelは最近、アルテラ(2番目に大きいFPGAメーカー)を買収し、現在、FPGAハードウェアアクセラレータを搭載したボードを販売しています。ソフトウェアは、API呼び出しを使用して、実行時にFPGAにイメージをロードできます。次に、CPUはデータをFPGAに送り、ほとんどの作業を実行できるようにします。アプリケーションのタイプは通常、ビデオエンコーディング、AI、レンダリング、データベース検索などです。


また、PC上では通常、数百または数千のスレッドが同時に実行されていることに注意してください。 いいえ、実行していません。現代のデスクトップには多くのスレッドが存在しますが、ほとんどすべてのスレッドはスリープ状態にあり、いつでもI / Oまたはタイマーを待機しています。たとえば、Linuxデスクトップの負荷平均(最後の1分間)は、現在0.19タスクであり、特定の瞬間にCPU時間を使用する準備ができています。ビデオエンコードを実行していた場合、x264はOSが複数のコアでスケジュールするために複数のスレッドを開始していましたが、論理コアとほぼ同じくらいです。
ピーターコーデス

ところで、OP(何らかの理由で)は周波数を完全に省略し、IPC(クロックサイクルごとの命令)ではなく、1秒あたりのスケーリングについて質問しました。あなたの言うことは本当ですが、CPUをより高くすることではなく、より広くすることを提案していました。私はすでに答えでそれを取り上げたので、周波数での電力スケーリングを説明するあなたの答えは素晴らしい追加です、+ 1。
ピーターコーデス

@PeterCordes確かに、すべてのスレッドが一度に実行されることを意味するつもりはありませんでした。明確にしてくれてありがとう。
user4574

ほとんどの場合、まったく実行する準備ができていないので、「交代」ではありません。それらはほとんどすべて眠っており、通常は、OSがキー入力イベントまたはネットワーク読み取りを配信した後、またはタイマーが切れたためにそれらを起動した後など、計算の短いバーストでのみ起動します。あなたが実際に計算集約的な何かをしているのでなければ、一度に2つ以上が目覚めることはまれです。そして、あなたがそうであるなら、あなたは何百ものスレッドを開始するのではなく、あなたは多くのスレッドを開始します〜= number of available cores。
ピーターコーデス

2

これがどこに向かっているのかを概観するために...

ニューラルネットワークとAIは、現時点で非常にホットなトピックです。理由の1つは、膨大な数の単純なコアを効率的に並行して使用できるため、最大の計算パフォーマンスに近い値を抽出できることです。要件は本質的に超並列であり、コア間で多くの通信を必要とせずにプロセッサの配列にかなり簡単にマッピングします。これが、GPUがAIアクセラレーションの最初のgotoテクノロジーであった理由です。現在、市場に出回っているNN向けのビデオGPUよりもさらに優れた最適化されたチップを見ています。次の、またはおそらく最終的なステップは、メモリスタなどのアナログ技術を使用してNNを作成することです。

余談ですが、ゲームPCのようなものでは、マルチコアIntelまたはAMD CPUよりもグラフィックカードのパフォーマンスがはるかに高くなります。


2
「...本質的に超並列」:でも、あきれるほど平行
ピーターモーテンセン

1

基本的に、CMOS損失は周波数に指数関数的に(^ 1.5)比例し、並列CPUのパフォーマンスはCPUの数に比例する線形よりもやや低くなります。

したがって、電力消費を固定した場合の速度とCPUの数量を比較すると、異なるクロックレートでのマルチCPUアプリケーションの電力消費と電力消費の比率が向上します。

これよりも複雑ですが、これらが、動的アプリケーションで並列CPUがワットあたりの優れた性能を発揮する理由です。1つのシナリオに最適化すると、常に例外が発生します。

Intel / AMDの典型的なPCアプリケーションを高速化するのは、より大きなCPUのサイズではなく、リソグラフィの解像度とゲート容量の低減によりサイズが小さくなり、サブスレッショルドレベルとコア電圧が低下します。

改善は線形ではなく、8コアが2倍の4倍であることを意味しませんが、達成される場合の目標は、消費電力、速度、および電圧の調整により処理ダイナミックレンジを増やし、パフォーマンスと効率、およびピーク時の電力オンデマンドを改善することです過度の温度上昇。

より科学的な回答については、https://www.sciencedirect.com/topics/computer-science/dynamic-power-consumptionをご覧ください。


-2

通常、マルチコアはマルチスカラーではありません。また、マルチスカラーコアはマルチコアではありません。

数メガヘルツで動作するマルチスカラーアーキテクチャを見つけるのは完璧なものになりますが、一般にそのブリッジは消費者向けではなく、コストがかかるため、傾向は高クロック速度での短い命令ではなく、低周波数でのマルチコアプログラミングになります。

複数の命令コアは、より安価で簡単にコマンドを実行できるため、数ギガヘルツのマルチスカラーアーキテクチャを使用するのは悪い考えです。


1
「スーパースカラー」、つまりクロックごとに複数の命令を意味しますか?ほとんどのマルチコアCPUスーパースカラーです。たとえば、Ryzenは5ワイドです。AppleのハイエンドAArch64チップは6または8幅です。2ワイドCPUがほとんどのコードで活用するための多くの低品質の果物があるので、それぞれ独自のプライベートキャッシュとコア間の相互接続を必要とする複数のコアにスケーリングする前に、各コアを少なくとも2ワイドにする価値があります(たとえば、IntelのXeon Phiメニーコアコンピューティングカードには、多くのデュアル発行コアがあります)。スマートフォンコアについても同様です。小さなコアは少なくとも2ワイドです。シングルスレッドのパフォーマンスが重要です!
ピーターコーデス

1
またはdl.acm.org/citation.cfm?id=224451を意味します-「Multiscalar」コアと呼ばれる、高レベルプログラムの制御フローグラフのより広い範囲でILPを探すコアに関する研究論文HWとSWの組み合わせ。私たちがデスクトップやスマートフォンで使用する主流のCPUはこのようなものではありません。これらは通常のスーパスカラであり、命令を1つずつ実行するふりをするシリアルISAを実装する、アウトオブオーダー実行を備えています。
ピーター・コーデス

ありがとう。afaik、スカラーアーチの背後にある考え方は、既知または定義済みの命令セット(AVXの場合)の背後にある熱の測定可能性です。<br/>現在のアーキテクチャの計算対熱は、計算可能に予測可能ではありません。これにより、時間/熱の理想で実行する能力が計算できないため、マルチコアが大きな周波数で実行される可能性が低くなります。これが私がこれまでに知っているすべてです。「マルチスカラー」の物理を理解するために、この目的のためにベクターマシンを掘っています。ケースは、xeon / phyが古代cpusのように理想的な熱曲線に従っている場合です。カスタマーエクスペリエンスの向上
machtur

AVXのようなSIMD命令セットは、パイプライン全体を実行ユニットだけに広げることなく、パイプライン介してより多くの作業を行う方法です。たとえば、Skylakeはvpaddd ymm0, ymm1, ymm2クロックごとに3つの命令を実行でき、各命令は8つのパックされた32ビット整数の加算を実行します。したがって、クロックごとに24個の整数が加算されますが、異常な実行機構は「のみ」飛行中の3つの命令を追跡する必要があります。それがありますずっと 24個の実行できるCPU以外のビルドに安くadd eax, edxクロックあたりの命令を。SIMDは、基本的にパイプライン幅に直交しています。
ピーターコーデス

Skylakeは、クロックサイクルごとの最適化の良い例です。スカイレイクはXeonオリジナルのオフロードをSIMDパイプラインにそのように統合するため、バリアントは多数ありますが、内部バス最適化の興味深いケースです。1つの大きなコアが、AVXの場合のように(たとえば)天才のように、数サイクルでオフロードと計算を統合すると想定しています。これは、内部ブロック操作に必要な電力と比較して、計算が前方に統合された方法です。Nehalemへの追加に似た複数の「仮想」コアを持つGpuのような複数の短い命令の反対として
machtur
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.